上代码简单了解一下:
1 package com.synchronize.test; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.HashSet; 7 import java.util.Iterator; 8 import java.util.List; 9 import java.util.Map; 10 import java.util.Map.Entry; 11 import java.util.Set; 12 /* 13 * 同步控制 14 * 1.常用的容器ArrayList,HashSet,HashMap都是线程不安全的 15 * 2.Collection提供了synchronizedList(),synchronizedSet(),synchronizedMap()三个方法 16 * ,能够将指定的容器包装成同步。 17 * 不可变设置(只读访问),Collection提供了三种方法: 18 * (1)emptyXxx():空的不可变的集合 19 * (2)singletonXxx():一个元素不可变的集合 20 * (3)unmodifiableXxx():不可变容器 21 */ 22 public class synchronizedTest { 23 public static void main(String[] args) { 24 synchronizedListTest(); 25 synchronizedMapTest(); 26 synchronizedSetTest(); 27 } 28 //首先对list容器进行安全管理及设置只读访问 29 public static void synchronizedListTest() { 30 List<String> list=new ArrayList<String>(); 31 list.add("复仇者联盟"); 32 list.add("再见"); 33 //设置list可以同步,制作一个线程安全的新的synList 34 List<String> synList=Collections.synchronizedList(list); 35 System.out.println("list未设置只读访问容器内数据量为:"+list.size()); 36 System.out.println(synList.get(1)+","+synList.get(0)+"!"); 37 //设置list不可变,只读访问,并且将其变成了空的不可变的集合 38 list=Collections.emptyList(); 39 //这里已经不允许再添加数据,所以执行到这里直接抛出异常 java.lang.UnsupportedOperationException 40 /*list.add("测试");*/ 41 System.out.println("list设置只读访问容器内数据量为:"+list.size()); 42 } 43 //然后对map容器进行同样的操作 44 public static void synchronizedMapTest() { 45 Map<String,String> map=new HashMap<String,String>(); 46 map.put("吾爱", "执念已故,心无所处"); 47 map.put("吾念","向之所深,弃之无助"); 48 //设置map可以同步,制作一个线程安全的synMap 49 Map<String,String> synMap=Collections.synchronizedMap(map); 50 System.out.println("map未设置只读访问容器内数据量为:"+map.size()); 51 //借助set容器将map容器里面的数据读取出来 52 Set<Entry<String, String>> set=map.entrySet(); 53 //构造迭代器访问数据元素 54 Iterator it=set.iterator(); 55 while(it.hasNext()) { 56 System.out.println(it.next()); 57 } 58 //设置只读访问,并且将其变成了空的不可变的集合 59 map=Collections.emptyMap(); 60 /*map.put("测试", "成功");*/ 61 System.out.println("map设置只读访问容器内数据量为:"+map.size()); 62 } 63 //最后对set容器实现同样的操作 64 public static void synchronizedSetTest() { 65 Set<String> set=new HashSet<String>(); 66 set.add("所爱隔山海,"); 67 set.add("山海皆可平。"); 68 //设置set可以同步,同时产生一个线程安全的syncSet 69 Set<String> syncSet=Collections.synchronizedSet(set); 70 System.out.println("set未设置只读访问容器内数据量为:"+set.size()); 71 //构造迭代器访问数据元素 72 Iterator it=set.iterator(); 73 while(it.hasNext()) { 74 System.out.println(it.next()); 75 } 76 //设置只读访问 77 set=Collections.emptySet(); 78 /*set.add("测试");*/ 79 System.out.println("set设置只读访问容器内数据量为:"+set.size()); 80 } 81 82 }
效果截图:
抛出异常截图:
由上面的截图可以看出来,当我把synchronizedListTest()方法里面的list.add("测试")去掉注释后,直接就抛出了异常,容器的大小已经被固定了,所以无法继续往其中在添加数据,如果继续添加则直接抛出java.lang.UnsupportedOperationException的异常,这也许能够对数据量起到一定的控制效果。
ps:这里只是简单了解一下,作为学习日记而用,所以写的不好之处望见谅,欢迎各位大佬们指正,我必虚心求学。