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 ...
随机推荐
- Samba部署共享服务
在本地PC文件共享 Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享资源软件,实现了Windows和Linux系统间的文件共享 1.安装Samba服务程序 yum in ...
- 算法与数据结构(八) AOV网的关键路径(Swift版)
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- Linux下源码安装并配置Nginx
实验环境 一台最小化安装的CentOS 7.3 虚拟机 安装nginx 安装nginx依赖包 yum install -y pcre-devel zlib-devel openssl-devel wg ...
- [Swift]LeetCode115. 不同的子序列 | Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...
- [Swift]LeetCode895. 最大频率栈 | Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- java中this和super关键字的使用
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...
- Java面向对象特征之封装
package practice;/** * @功能 创建动物类,对动物的属性进行封装 * @author square 凉 * */public class Animal { /** * 动物姓名 ...
- Python—day17时间模块、系统模块、递推遍历、序列化
一.time'''时间戳(timestamp):time.time()延迟线程的运行:time.sleep(secs)(指定时间戳下的)当前时区时间:time.localtime([secs])(指定 ...
- Python内置函数(51)——property
英文文档: class property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget is ...
- 【从零开始自制CPU之学习篇00】开篇
从今天开始决定用面包板制作一个8位的CPU,实现几个简单的指令.我给自己分两大部分计划,第一部分是学习制作CPU的理论知识,第二部分是实践.并打算实施计划的同时用博客的方式记录下来.理论知识的部分重点 ...