上代码简单了解一下:

 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. unittest生产html测试报告

    需要添加HTMLTestRunner.py文件,我用的ubuntu16.04下的python3.5.2,所以我放在/usr/lib/python3.5下 import unittest import ...

  2. LeetCode编程训练 - 回溯(Backtracking)

    回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...

  3. Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

    ASP.NET Core知多少系列:总体介绍及目录 Demo路径:GitHub-RPL.Demo 1. Introduction Razor Page Library 是ASP.NET Core 2. ...

  4. PHP 点阵5*7字体

    效果: 源码: <?php // standard ascii 5x7 font 纵向取模 // defines ascii characters 0x20-0x7f (32-127) $fon ...

  5. [Swift]LeetCode225. 用队列实现栈 | Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  6. RabbitQM(消息duilie)

    前言:RabbitMQ 是实现 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息, ...

  7. Xapian索引-文档检索过程分析

    本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1  检索语法 面对不同的检索业务,我们会有多种检索 ...

  8. BBS论坛(三十二)

    32.帖子排序功能完成 (1)front_index.html <ul class="post-group-head"> {% if current_sort==1 % ...

  9. Java核心技术及面试指南:视频列表

    如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1  JDK和JRE和JVM的区别,安装Java开发环境    1.1.1  第2页 2 视频1.2  编写第一个HelloWorld程序 ...

  10. 【jQuery】(1)---初次接触Jquery

    1.浅理解Jquery:jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents.events.实现动画效果,并且方便地为网站提供AJAX交互. 2.D ...