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

时间:2023-03-09 20:51:11
java-同步控制及不可变设置(只读访问)

上代码简单了解一下:

 package com.synchronize.test;

 import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/*
* 同步控制
* 1.常用的容器ArrayList,HashSet,HashMap都是线程不安全的
* 2.Collection提供了synchronizedList(),synchronizedSet(),synchronizedMap()三个方法
* ,能够将指定的容器包装成同步。
* 不可变设置(只读访问),Collection提供了三种方法:
* (1)emptyXxx():空的不可变的集合
* (2)singletonXxx():一个元素不可变的集合
* (3)unmodifiableXxx():不可变容器
*/
public class synchronizedTest {
public static void main(String[] args) {
synchronizedListTest();
synchronizedMapTest();
synchronizedSetTest();
}
//首先对list容器进行安全管理及设置只读访问
public static void synchronizedListTest() {
List<String> list=new ArrayList<String>();
list.add("复仇者联盟");
list.add("再见");
//设置list可以同步,制作一个线程安全的新的synList
List<String> synList=Collections.synchronizedList(list);
System.out.println("list未设置只读访问容器内数据量为:"+list.size());
System.out.println(synList.get(1)+","+synList.get(0)+"!");
//设置list不可变,只读访问,并且将其变成了空的不可变的集合
list=Collections.emptyList();
//这里已经不允许再添加数据,所以执行到这里直接抛出异常 java.lang.UnsupportedOperationException
/*list.add("测试");*/
System.out.println("list设置只读访问容器内数据量为:"+list.size());
}
//然后对map容器进行同样的操作
public static void synchronizedMapTest() {
Map<String,String> map=new HashMap<String,String>();
map.put("吾爱", "执念已故,心无所处");
map.put("吾念","向之所深,弃之无助");
//设置map可以同步,制作一个线程安全的synMap
Map<String,String> synMap=Collections.synchronizedMap(map);
System.out.println("map未设置只读访问容器内数据量为:"+map.size());
//借助set容器将map容器里面的数据读取出来
Set<Entry<String, String>> set=map.entrySet();
//构造迭代器访问数据元素
Iterator it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//设置只读访问,并且将其变成了空的不可变的集合
map=Collections.emptyMap();
/*map.put("测试", "成功");*/
System.out.println("map设置只读访问容器内数据量为:"+map.size());
}
//最后对set容器实现同样的操作
public static void synchronizedSetTest() {
Set<String> set=new HashSet<String>();
set.add("所爱隔山海,");
set.add("山海皆可平。");
//设置set可以同步,同时产生一个线程安全的syncSet
Set<String> syncSet=Collections.synchronizedSet(set);
System.out.println("set未设置只读访问容器内数据量为:"+set.size());
//构造迭代器访问数据元素
Iterator it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//设置只读访问
set=Collections.emptySet();
/*set.add("测试");*/
System.out.println("set设置只读访问容器内数据量为:"+set.size());
} }

效果截图:

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

抛出异常截图:

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

由上面的截图可以看出来,当我把synchronizedListTest()方法里面的list.add("测试")去掉注释后,直接就抛出了异常,容器的大小已经被固定了,所以无法继续往其中在添加数据,如果继续添加则直接抛出java.lang.UnsupportedOperationException的异常,这也许能够对数据量起到一定的控制效果。

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