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

  • 相关阅读:
    IntegrityError duplicate key value violates unique constraint
    LeetCode 212: Word Search II
    LeetCode: Lowest Common Ancestor of a Binary Search Tree 解题报告
    LeetCode: Unique Paths II 解题报告
    LeetCode: Unique Paths 解题报告
    LeetCode: Remove Nth Node From End of List 解题报告
    LeetCode: Convert Sorted List to Binary Search Tree 解题报告
    LeetCode: Path Sum II 解题报告
    lintcode: k Sum 解题报告
    LeetCode: Unique Binary Search Trees II 解题报告
  • 原文地址:https://www.cnblogs.com/weekstart/p/10788709.html
Copyright © 2020-2023  润新知