![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发编程实战
纯白色de情调
这个作者很懒,什么都没留下…
展开
-
第七章 取消和关闭
首先我们很少希望某个任务、线程活服务立刻停止,这样会造成数据不一致的状态。通常我们希望会清除当前正在执行的工作,然后在结束。可惜的是java中并没有一种安全的抢占方法来停止线程。但是它提供了中断(Interruption),这是一种协作机制,能够使一个线程终止另一个线程。这样提供了更好的灵活性,因为任务本身的代码比发出请求的代码更清楚如何执行清楚工作。7.1 任务取消如果外部代码能在某个操作...原创 2019-05-01 13:24:54 · 345 阅读 · 0 评论 -
第十四章 构建自己的同步工具
14.1 状态依赖性的管理对于并发对象上依赖状态的方法,虽然有时候在前提条件不满足的情况下不会失败,但通常有一种更好的选择,即等待前提条件变为真。在并发程序中,依赖状态的操作可以一直阻塞直到可以继续执行,这比使它们先失败再实现起来更为方便且更不易出错。可阻塞的状态依赖操作的形式如14-1所示,这种加锁模式有些不同,因为锁是在操作的执行过程中被释放与重新获取的。构成前提条件的状态变量必须由对...原创 2019-05-01 13:24:10 · 181 阅读 · 0 评论 -
第十五章 原子变量与非阻塞同步机制(CAS)
与基于锁的方案相比,非阻塞在设计和实现上都要复杂得多,但他们在可伸缩性和活跃性上却有着巨大优势。由于非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在颗粒度更细的层次上进行协调,并且极大地减少开销。而且,在非阻塞算法中不存在死锁和其他活跃性问题。15.1 锁的劣势通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都能采用独占方式来访问这些变量,...原创 2019-05-01 13:23:49 · 205 阅读 · 0 评论 -
第十三章 显示锁
13.1 Lock与ReenTrantLockLock是个接口其中抽象的定义了加锁操作,无条件的,可轮询的,定时的以及可中断的锁获取操作。所有加锁和解锁方法都是显式的。在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义,调度算法,顺序保证以及性能特性等方面可以有所不同// 13-1 Lock接口public interface Lock { //加锁,...原创 2019-05-01 13:24:15 · 138 阅读 · 0 评论 -
第六章 围绕任务来说
第六章 围绕任务来说1、在线程中执行任务任务要有自己明确的边界,之间相互独立。任务并不依赖其他任务的状态、结果或边界,尽量别有耦合。当负荷过载应当逐渐降低效率,而不是直接失败。(1)、单线程的执行任务。碰到阻塞不仅会推迟当前请求的完成,还会彻底阻止等待中的请求被处理。阻塞时间过长用户将认为服务器不可以。服务器资源利用率相当低。但是能保证数据的完整性和原子性。并且实现任务也会简单很多。(2)...原创 2019-05-01 13:24:59 · 343 阅读 · 0 评论 -
第十章 锁与活跃性的那些事
安全性和活跃性之间存在某种制衡:使用加锁机制来确保线程安全,但如果过度使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。同样,使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁(Resource Deadlock)java程序无发从死锁中恢复出来。10.1 死锁如果每个人都拥有其他人需要的资源,同时又等待其他人已经拥有的资源,并且每个人...原创 2019-05-01 13:24:19 · 262 阅读 · 0 评论 -
第四章 之地基
线程安全性的委托Java中对象大多是组合对象,如果组合对象都已经是线程安全的,还需要给这些组合对象增加一个线程安全层吗?答案:“视情况而定”!三种委托方式:如果组合对象A的状态是由线程安全的组合对象B的状态构成的,那么A的线程安全就可以委托给B来保证;如果组合对象A的状态是由线程安全的组合对象B、C、D….的状态构成,想让A的状态委托给这些对象,需要这些对象是彼此独立的。即不用在...原创 2019-05-01 13:23:03 · 146 阅读 · 0 评论 -
第五章 站在巨人的肩膀上
多线程5 站在巨人的肩膀上原创 2019-05-01 13:24:25 · 537 阅读 · 0 评论 -
第八章 玩转线程池
8.1 在任务与执行策略之间的隐性耦合Executor框架可以将任务的提交与任务的执行策略解耦开来。虽然Executor框架为制定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都能使用所有的执行策略。有些类型的任务需要明确地指定执行策略,包括:①依赖性任务如果提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题...原创 2019-05-01 13:24:46 · 221 阅读 · 0 评论 -
第八章 线程池的使用之推箱子
谜题框架(A Puzzle Framework)递归算法的并行化的一种引用就是解决一些谜题,这些谜题都需要找出一系列的操作从初始状态转换到目标状态,例如类似与“搬箱子”,“四色方柱”和其他棋牌谜题。我们将谜题定义为:包含了一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。规则集包含两个部分:计算从指定位置开始的所有合法移动,以及每次移动的结果位置。8-13给出了表示谜题的抽象类...原创 2019-05-01 13:24:50 · 208 阅读 · 0 评论 -
第十四章 了解同步器
14.4 Synchronizer(同步器)剖析ReentrantLock和Semaphore这两个接口之间存在许多共同点,这两个类都已用做一个“阀门”,即每次只允许一定数量的线程通过,并当线程到达阀门时,可以通过(在调用lock或acquire时成功返回),也可以等待(在调用lock或acquire时阻塞),还可以取消(在调用tryLock或tryAuquire时返回”假”,表示在指定的时间内...原创 2019-05-01 13:24:06 · 261 阅读 · 0 评论