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());
} }
效果截图:

抛出异常截图:

由上面的截图可以看出来,当我把synchronizedListTest()方法里面的list.add("测试")去掉注释后,直接就抛出了异常,容器的大小已经被固定了,所以无法继续往其中在添加数据,如果继续添加则直接抛出java.lang.UnsupportedOperationException的异常,这也许能够对数据量起到一定的控制效果。
ps:这里只是简单了解一下,作为学习日记而用,所以写的不好之处望见谅,欢迎各位大佬们指正,我必虚心求学。
java-同步控制及不可变设置(只读访问)的更多相关文章
- Java并发编程(03):多线程并发访问,同步控制
本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...
- cxf设置代理访问webservice接口
由于业务上的需要,需要访问第三方提供的webservice接口,但由于公司做了对外访问的限制,不设置代理是不能外网的,如果使用http设置代理访问外网还是比较容易的,但使用cxf有点不知道从哪里入手. ...
- Windows Azure 存储的冗余存储选项和只读访问跨地域冗余存储
我们很高兴地宣布,现在我们使客户可以获得对数据更高的读取可用性.该预览功能称为"只读访问- 跨地域冗余存储(RA-GRS)",使客户可以在存储帐户主要区域无法读取数据时,通过跨 ...
- 深入理解Java中的不可变对象
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...
- EditText控件设置只读
android的文本框输入控件(EditText),有时需要设置控件为只读,最简单的方法就是在layout xml文件中设置EditText的android:editable属性值为false即可,但 ...
- 为什么 String 在 Java 中是不可变的?
我最喜欢的 Java 面试问题,很棘手,但同时也非常有用.一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的.字符串在 Java 中是不可变的,因为 String 对象 ...
- postgresql 设置只读用户
postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...
- 动态设置和访问cxgrid列的Properties(转)
原文:http://www.cnblogs.com/hnxxcxg/archive/2010/05/24/2940711.html 动态设置和访问cxgrid列的Properties 设置: cxGr ...
- Java中Map集合的四种访问方式(转)
最近学习Java发现集合类型真是很多,访问方式也很灵活,在网上找的方法,先放下备用 public static void main(String[] args) { Map<String, St ...
随机推荐
- vi 配置
vim ~/.vimrc source ~/.vimrc 添加相关配置 一直生效 0 行首 $ 行尾 spacebar 空格键: 合并多行 spaceba ...
- 学用HBuilder开发App的看过来
自己的呕心沥血之作吧,花了一年时间,系统介绍HTML5 App开发的相关技术. 越来越多的公司采用HTML5来快速开发移动跨平台App,它支持当前市场流行的移动设备. 本书主要介绍了HTML5在移动A ...
- postman run之前需要手动调整顺序
最近刚入坑postman,记录下遇到的坑: 1.先用postman interceptor录制好脚本,在postman中,将History的脚本导入Collections,由于项目接口之间需要toke ...
- Mesos源码分析(1): Mesos的启动过程总论
- [Swift]LeetCode80. 删除排序数组中的重复项 II | Remove Duplicates from Sorted Array II
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- [Swift]LeetCode367. 有效的完全平方数 | Valid Perfect Square
Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...
- [Swift]LeetCode451. 根据字符出现频率排序 | Sort Characters By Frequency
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- [Swift]LeetCode721. 账户合并 | Accounts Merge
Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...
- [Swift]LeetCode848. 字母移位 | Shifting Letters
We have a string S of lowercase letters, and an integer array shifts. Call the shift of a letter, th ...
- [Swift]LeetCode852. 山脉数组的峰顶索引 | Peak Index in a Mountain Array
Let's call an array A a mountain if the following properties hold: A.length >= 3 There exists som ...