java并发编程实战笔记---(第五章)基础构建模块
.
5.1同步容器类
1.同步容器类的问题
复合操作,加容器内置锁


2.迭代器与concurrentModificationException
迭代容器用iterator, 迭代过程中,如果有其他线程修改容器,那么会抛出ConcurrentModificationException。迭代地方都需加锁
iterator是fail-fast及时失败机制。
解决方法:加锁可能死锁,复制容器性能有问题。
3.隐藏迭代器
加锁可以避免迭代抛出异常,那么所有对共享容器 迭代地方都需加锁。但是实际情况比较复杂 ,有时迭代器可能隐藏。
隐藏在字符串连接中的迭代操作。
编译器将字符串的连接转换为StringBuilder.append(Object),这个方法又会调用容器的tostring方法,标准容器的tostring方法会迭代容器。并在每个元素上调用tostring来生产容器内容的格式化表示。

*******下面的话

5.2 并发容器
同步容器将所有对容器状态的访问都串行化,当多个线程竞争容器的锁时,吞吐量严重降低。
并发容器针对多线程访问设计,并发容器代替同步容器可提高伸缩性并降低风险。
queue
ConcurrentLinkedQueue是传统fifo队列,PriorityQueue是非并发的优先队列。
BlockingQueue增加了可阻塞的插入和获取。ConcurrentHashMap并发map,concurrentSkipList.set
1.ConcurrentHashMap

同步容器等待时间可能较长,效率较低。
ConcurrentHashMap使用分段锁机制,使得多个线程可以同时正删改容器内容。效率较高。
ConcurrentHashMap与其他并发容器增强了同步容器的迭代器,不会抛出ConcurrentModificationException,不用加锁迭代。弱一致性机制(weakly consistent),而非fail-fast。
size,isEmpty功能弱化了,结果可能不精确,主要确保remove,get,put,containsKey等功能性能优化。
一般使用ConcurrentHashMap,只有需要对容器进行独占访问时,采用HashTable或者SynchronizedMap.
2.ConcurrentMap额外的原子Map操作

3.CopyOnWriteList
CopyOnWriteList代替同步list,有时有更好的并发性能,而且迭代时不用加锁或复制。
写入时复制:只要发布一个事实不可变的对象,

每当修改会复制,消耗性能,所以当迭代操作远远多余修改操作时使用。
适用于事件通知系统,遍历已注册监听器列表的操作较多,增加或者移除监听器操作相对较少。
5.3阻塞队列 消费者-生产者模式
1.阻塞队列提供可阻塞的put,take方法,可定时的offer,poll方法,队列可有界,可无界。
BlockingQueue简化了生产者消费者模式的实现,支持任意数量的生产者和消费者。最常见生消举例:线程池和工作队列的组合。
有时需要调整生产者消费者的比率。offer可返回操作成败,以判断是否需要修改调整负载。有界队列可以防止产生过多的生产,避免负载过高。
需要尽早设计有界队列或者通过信号量semaphore设计资源管理机制。
BlockingQueue有多种实现,LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQueue,SynchronousQueue没有缓冲,生产一个消费一个,否则一直阻塞,或者说容量就是1.应该适用于单生产单消费。
实例:桌面搜索
将工作内容进行拆分:查找文件为生产者的工作,建立索引为消费者的工作。
2.串行线程封闭


3.双端队列,工作密取
适用于既是生产者又是消费者,自产自消,(递归)执行过程发现更多的任务,往自己队列加任务。

5.4阻塞方法和中断方法
线程阻塞或暂停执行:等待io操作完成,等待获取某个锁,等待Thread.sleep中醒来,等待其他线程的计算结果等等。


5.5同步工具类
同步工具类:根据自身的状态控制线程的执行流。阻塞队列,信号量(Semaphore),栅栏(Barriar),闭锁(Latch).
1.闭锁 (相当于一扇门)
线程等到某个状态或者时刻才可以继续执行

new countdownlatch(N)
countdown()
await()
让一定数量线程等待N个事件处理完成才继续操作。


起始门使得主线程同时释放所欲执行线程,结束门使得主线程等待所有执行线程结束。
一种倒计数锁存器,如上例。
另一种典型用法是,将一个问题分成 N 个部分,用执行每个部分并让锁存器倒计数的 Runnable 来描述每个部分,然后将所有 Runnable 加入到 Executor 队列。当所有的子部分完成后,协调线程就能够通过 await。(当线程必须用这种方法反复倒计数时,可改为使用 CyclicBarrier。)
2.FutureTask
get在获取到结果之前一直处于阻塞状态,实现了runnable接口。 继承future


3.信号量 (数量)
控制同时访问某个特定资源的操作数量,或者同时执行某个操作的数量。计数信号量可以实现某种资源池,或者对容器施加边界。




4.栅栏


5.6构建高效且可伸缩的结果缓存
1.用concurrenthashmap 可以并发操作,不像加锁效率低
2.用FutureTask 当一个计算时间较长时,另一个线程等待拿到结果
3.用putIfAbsent if判断不能确保原子性

java并发编程实战笔记---(第五章)基础构建模块的更多相关文章
- java并发编程实战:第五章----基础构建模块
委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可. 一.同步容器类 1.同步容器类的问题 同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进 ...
- java并发编程实战学习(3)--基础构建模块
转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put ...
- 《Java并发编程实战》第五章 同步容器类 读书笔记
一.同步容器类 1. 同步容器类的问题 线程容器类都是线程安全的.可是当在其上进行符合操作则须要而外加锁保护其安全性. 常见符合操作包括: . 迭代 . 跳转(依据指定顺序找到当前元素的下一个元素) ...
- java并发编程实战笔记---(第二章)线程安全:正确性
ThreadA__________ 同步 ______________ 异步 ___________ 异步 ThreadB__________ ____________ ...
- 【java并发编程实战】第五章:基础构建模块
1.同步容器类 它们是线程安全的 1.1 vector和hashtable. 和Collections.synchronizeXxx()一样.实现方式就是在每个方法里面加入synchronize代码块 ...
- Java并发编程实战.笔记十一(非阻塞同步机制)
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- 《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记
造成开销的操作包含: 1. 线程之间的协调(比如:锁.触发信号以及内存同步等) 2. 添加�的上下文切换 3. 线程的创建和销毁 4. 线程的调度 一.对性能的思考 1 性能与可伸缩性 执行速度涉及下 ...
- 《Java并发编程实战》第六章 任务运行 读书笔记
一. 在线程中运行任务 无限制创建线程的不足 .线程生命周期的开销很高 .资源消耗 .稳定性 二.Executor框架 Executor基于生产者-消费者模式.提交任务的操作相当于生产者.运行任务的线 ...
- 《Java并发编程实战》第七章 取消与关闭 读书笔记
Java没有提供不论什么机制来安全地(抢占式方法)终止线程,尽管Thread.stop和suspend等方法提供了这种机制,可是因为存在着一些严重的缺陷,因此应该避免使用. 但它提供了中断In ...
随机推荐
- Hdu3022 Sum of Digits
Sum of Digits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...
- SSM与SSH的对比
struts与springMVC的对比: 1.核心控制器(前端控制器.预处理控制器):负责接收页面请求和返回数据给页面. 对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有 ...
- array_unique后,数组本身的值并不会变
<?php $arr = [ ' ]; print_r($arr); print_r(array_unique($arr)); print_r($arr); //array_unique后,数组 ...
- zlib解压缩gzip
zlib是个著名的开源解压缩库,gzip是一种压缩文件格式. zlib可以压缩原始数据并输出gzip文件,gzip文件中除了压缩数据外,还有描述这些数据的文件头,所以当原始数据较小时,会出现zlib的 ...
- OpenCV---模糊操作
推文:图像平滑处理(归一化块滤波.高斯滤波.中值滤波.双边滤波) 推文:图像的平滑与滤波 模糊操作 三种模糊操作方式 均值模糊 中值模糊 自定义模糊(可以实现上面两种模糊方式) 原理: 图像处理:基础 ...
- vim 常用快捷键(整理版)
最常用: x 删除后面的字符 X 删除前一个字符 删除3个字符就是3x dd:删除一行 D 删除到行尾 J:删除换行符,使下一行并上来. nJ:连接后面的n行 u:撤销上一次操作 ...
- 数学:A^B的约数(因子)之和对MOD取模
POJ1845 首先把A写成唯一分解定理的形式 分解时让A对所有质数从小到大取模就好了 然后就有:A = p1^k1 * p2^k2 * p3^k3 *...* pn^kn 然后有: A^B = p1 ...
- Atcoder #017 agc017 B.Moderate Differences 思维
LINK 题意:给出最左和最右两个数,要求往中间填n-2个数,使得相邻数间差的绝对值$∈[L,R]$ 思路:其实也是个水题,比赛中大脑宕机似的居然想要模拟构造一个数列,其实我们只要考虑作为结果的数,其 ...
- JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...