上代码简单了解一下:

 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-同步控制及不可变设置(只读访问)的更多相关文章

  1. Java并发编程(03):多线程并发访问,同步控制

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...

  2. cxf设置代理访问webservice接口

    由于业务上的需要,需要访问第三方提供的webservice接口,但由于公司做了对外访问的限制,不设置代理是不能外网的,如果使用http设置代理访问外网还是比较容易的,但使用cxf有点不知道从哪里入手. ...

  3. Windows Azure 存储的冗余存储选项和只读访问跨地域冗余存储

    我们很高兴地宣布,现在我们使客户可以获得对数据更高的读取可用性.该预览功能称为"只读访问- 跨地域冗余存储(RA-GRS)",使客户可以在存储帐户主要区域无法读取数据时,通过跨 ...

  4. 深入理解Java中的不可变对象

    深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...

  5. EditText控件设置只读

    android的文本框输入控件(EditText),有时需要设置控件为只读,最简单的方法就是在layout xml文件中设置EditText的android:editable属性值为false即可,但 ...

  6. 为什么 String 在 Java 中是不可变的?

    我最喜欢的 Java 面试问题,很棘手,但同时也非常有用.一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的.字符串在 Java 中是不可变的,因为 String 对象 ...

  7. postgresql 设置只读用户

    postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...

  8. 动态设置和访问cxgrid列的Properties(转)

    原文:http://www.cnblogs.com/hnxxcxg/archive/2010/05/24/2940711.html 动态设置和访问cxgrid列的Properties 设置: cxGr ...

  9. Java中Map集合的四种访问方式(转)

    最近学习Java发现集合类型真是很多,访问方式也很灵活,在网上找的方法,先放下备用 public static void main(String[] args) { Map<String, St ...

随机推荐

  1. NeuChar 平台使用及开发教程(一):开始使用 NeuChar

    如果您还不知道什么是 NeuChar,或者我们为什么要做 NeuChar,请看这里. 角色 NeuChar 打通了从开发者到终端用户的完整的上下游链路,了解 NeuChar 之前,先要明确两个角色身份 ...

  2. [Swift]LeetCode263. 丑数 | Ugly Number

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  3. [Swift]LeetCode488. 祖玛游戏 | Zuma Game

    Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), gre ...

  4. 【Redis篇】初始Redis与Redis安装

    一.前述 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括st ...

  5. 微信小程序入门(六)

    28.页面路由 框架以栈的形式维护了当前的所有页面. 当发生路由切换的时候,页面栈的表现如下: 路由方式 29.小程序事件流 什么是事件? 事件是视图层到逻辑层的通讯方式 事件可以将用户的行为反馈到逻 ...

  6. .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...

  7. 关于 IdentityServer4 中的 Jwt Token 与 Reference Token

    OpenID Connect(Core),OAuth 2.0(RFC 6749),JSON Web Token (JWT)(RFC 7519) 之间有着密不可分联系,对比了不同语言的实现,还是觉得 I ...

  8. Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署

    运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...

  9. 自定义微信小程序导航(兼容各种手机)

    详细代码请见github,请点击地址,其中有原生小程序的实现,也有wepy版本的实现 了解小程序默认导航 如上图所示,微信导航分为两部分,第一个部分为statusBarHeight,刘海屏手机(iPh ...

  10. vue-eleme 学习笔记

     # watch 用法 (1).普通的watch <div style="margin-top: 60px;"> {{common}} <button @clic ...