【JAVA并发编程实战】3、同步容器
同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的
1、同步容器类的问题
同步容器类都是线程安全的,但是有些时候还是要客户端加锁来保护复合操作
就比如vector的操作,如果又两个方法一个获取vector集合的最后一个元素,一个删除最后一个元素
那么可能两个线程在同时操作的时候,A线程首先正在获取最后一个元素,get(lastElement),而在这个过程中如果B元素正在删除,删除了最后一个(last)然后就可能导致A线程执行失败,报错
那么如何避免这个问题呢?
那就是吧获取最后一个位置的索引和获取数据复合操作加锁,使其成为一个原子操作。同理获取索引和删除也是加锁,把容器类作为锁的对象
2、隐藏迭代器
如下
package cn.xf.cp.ch05;import java.util.HashSet; import java.util.Random; import java.util.Set;public class HiddenIterator {private final Set<Integer> set = new HashSet<Integer>();//添加与删除操作public synchronized void add(Integer i) { set.add(i); }public synchronized void remove(Integer i) { set.remove(i); }public void addTenThings(){Random r = new Random();for(int i = 0; i < 10; ++i){add(r.nextInt());}//注意这里可能会抛出异常,因为这里使用了set,但是没有加锁,也就是应该加上HiddenIterator的对象锁才可以//而在输出日志的时候,我们的set会调用toString方法,而这个方法会对容器进行迭代//也就是在调用toString方法的时候可能set会被修改,而迭代器在迭代的时候如果计数器被修改那么hasNext或next//将抛出ConcurrentModificationException异常System.out.println("DEBUG: added ten elements to " + set);} }
转载于:https://www.cnblogs.com/cutter-point/p/5998491.html
【JAVA并发编程实战】3、同步容器相关推荐
- aqs clh java_【Java并发编程实战】—– AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形. 其主要从双方面进行了改造:节点的结构与节点等待机制.在结构上引入了 ...
- Java并发编程实战笔记2:对象的组合
设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...
- Java并发编程实战————Semaphore信号量的使用浅析
引言 本篇博客讲解<Java并发编程实战>中的同步工具类:信号量 的使用和理解. 从概念.含义入手,突出重点,配以代码实例及讲解,并以生活中的案例做类比加强记忆. 什么是信号量 Java中 ...
- Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...
前言 大家都知道并发编程技术就是在同一个处理器上同时的去处理多个任务,充分的利用到处理器的每个核心,最大化的发挥处理器的峰值性能,这样就可以避免我们因为性能而产生的一些问题. 大厂的核心负载肯定是非常 ...
- java并发编程实战学习(3)--基础构建模块
转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put ...
- 视频教程-Java并发编程实战-Java
Java并发编程实战 2018年以超过十倍的年业绩增长速度,从中高端IT技术在线教育行业中脱颖而出,成为在线教育领域一匹令人瞩目的黑马.咕泡学院以教学培养.职业规划为核心,旨在帮助学员提升技术技能,加 ...
- java并发编程实战(二)
java并发编程中常常会用到两种容器来存放一些数据,这些数据需要保证能在多线程下正常访问.常见的容器分为两类:同步容器和并发容器.在java并发编程实战一书中的第五章也有讲解. 什么是同步容器以及优劣 ...
- 【极客时间】《Java并发编程实战》学习笔记
目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...
- 《Java 并发编程实战》--读书笔记
Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...
- java单线程共享,「Java并发编程实战」之对象的共享
前言 本系列博客是对<Java并发编程实战>的一点总结,本篇主要讲解以下几个内容,内容会比较枯燥.可能大家看标题不能能直观的感受出到底什么意思,这就是专业术语,哈哈,解释下,术语(term ...
最新文章
- redis缓存和cookie实现Session共享
- MPB:东林牛犇组玉米根系简化细菌群落的定量与其生物防治效果的评价方法(视频)...
- java开学第一周测试自我感想
- cola-ui的使用
- Apache solr(二).
- 阿里集团搜索和推荐关于效率稳定性的思考和实践
- php代码实现对word文件的查找与替换,ThinkPHP5使用phpword实现文件模板字符替换
- bootice 此功能仅在uefi环境下可用_电脑新手必掌握基础知识:BIOS、EFI与UEFI详解!...
- C语言不调用库函数画一个三角形
- ExtJs启用与禁用工具栏
- feign传递多个对象_面向对象
- java学生管理系统oracle_基于Java的Oracle学生成绩管理系统
- http 协议入门
- 使用浏览器检查工具下载网页视频
- 帝国时代2战役php文件,帝国时代各种类型文件使用说明
- Flutter 2.2 更新详解
- DDGDataCache OC文件缓存,代码简单,功能强大
- 数据类型和各种占位符
- 5.7亿巨奖质疑风暴
- jso是什么意思_js中this什么意思
热门文章
- c语言如何在文件中间插入数据,急求如何将下列C语言程序数据存储到文件中?...
- numpy维度交换_“lazy”的transpose()函数——从numpy 数组的内存布局讲起
- cdrom是多媒体微型计算机,全国计算机二级题库第三章
- qt 嵌入web页面_Qt嵌入浏览器(三)——QWebEngine与Https
- leetcode 55. 跳跃游戏 思考分析
- kotlin 查找id_Kotlin程序查找Square区域
- 线性结构节点类型(三)
- java: 程序包lombok不存在_Java开发神器:Lombok 学习指南
- 远控免杀专题(16)-Unicorn免杀
- redis源码剖析(六)—— Redis 数据库、键过期的实现