java-同步控制及不可变设置(只读访问)

上代码简单了解一下:

 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:这里只是简单了解一下,作为学习日记而用,所以写的不好之处望见谅,欢迎各位大佬们指正,我必虚心求学。

原文地址:https://www.cnblogs.com/weekstart/p/10788709.html