Java并发读书学习笔记
文章平均质量分 57
wuqingdeqing
生如逐放 心有焰藏
展开
-
Java并发读书学习笔记(六)——取消与关闭
6.1 任务取消如果外部代码能在某个操作正常完成之前将其置入完成状态,那么这个操作就可以称为可取消的。取消某个操作的原因很多:用户请求取消;有时间限制的操作;应用程序事件;错误;关闭。6.1.1 中断对中断的正确理解是:它不会真正地中断一个正在运行的线程,而只是发出中断请求。然后由线程在下一个合适的时刻中断自己(这些时刻也被称为取消点)。有些方法,例如wait,sleep,join等,将严格地处理...原创 2018-03-14 23:21:55 · 248 阅读 · 0 评论 -
Java并发读书学习笔记(十)——显式锁
10.1 Lock和ReentrantLockReentrantLock实现了Lock接口,并提供了synchronized相同的互斥性与内存可见性。在获取ReentrantLock时,有着进入同步代码块的内存语义,在释放ReentrantLock时,同样有着与退出同步代码块相同的内存语义。此外,与synchronized一样,ReentrantLock还提供可重入的加锁语义。ReentrantL...原创 2018-04-02 15:00:36 · 117 阅读 · 0 评论 -
Java并发读书学习笔记(九)——性能与可伸缩性
9.1 对性能的思考想要通过并发来获得更好的性能,需要努力做好两件事情:更有效地利用现有处理资源,以及在出现新的处理资源时使程序尽可能地利用这些资源。从性能监视的视角看,CPU需要尽可能保持忙碌状态。如果程序是计算密集型的,那么可以增加处理器来提高性能。如果因为程序无法使用现有的处理器保持忙碌状态,那么增加再多的处理器也无济于事。通过将应用程序分解到多个线程上执行,使得每个处理器都执行一些工作,从...原创 2018-04-01 23:48:10 · 132 阅读 · 0 评论 -
Java并发读书学习笔记(八)——避免活跃性危险
在安全性和活跃性之间通常存在某种制衡。使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,但这些被限制地行为可能会导致资源死锁。Java应用程序无法从死锁中,恢复过来,因此在设计时一定要排除那些可能导致死锁出现的条件。8.1 死锁当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。在线程A持有锁L并想...原创 2018-03-18 22:49:40 · 297 阅读 · 0 评论 -
Java并发读书学习笔记(三)——对象的组合
3.1 设计线程安全的类在线程安全的程序中,虽然可以将程序的所有状态都保存在公有的静态域中,但与那些将状态封装起来的程序相比,这些程序的安全性更难以得到验证,并且在修改时也更难以确保其线程安全性。通过使用封装技术,可以在不对整个程序进行分析的情况下判断一个类是否是线程安全的。同步策略定义了如何在不违背对象不变条件或后验条件的情况下对其状态的访问操作进行协同。同步策略规定了如何将不可变性、线程封闭与...原创 2018-02-25 22:37:53 · 189 阅读 · 0 评论 -
Java并发读书学习笔记(四)——基础构建模块
4.1 同步容器类同步容器类包括Vector和Hashtable,两者是早期JDK的一部分,这些同步的封装器类是由Collection.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使每次都只有一个线程能访问容器的状态。4.1.1 问题同步容器类都是线程安全的,但是在某些情况下可能需要额外的客户端加锁来保护复合操作。容...原创 2018-03-04 17:20:33 · 286 阅读 · 0 评论 -
Java并发读书学习笔记(二)——对象的共享
一种常见的误解是,认为关键字synchronized只能用于实现原子性或确定“临界区”。同步还有另一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程同时修改该状态,而且希望当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。如果没有同步,这种情况就无法实现。你可以通过显示的同步或者类库中内置的同步来保证对象被安全的发布。2.1 可见性可见性是一种复杂的属性,因...原创 2018-02-25 11:25:20 · 139 阅读 · 0 评论 -
Java并发读书学习笔记(一)——线程安全
要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)和可变(Mutable)状态的访问。从非正式意义上来说,对象的状态是指存储在状态变量中的数据。对象的状态可能包括其他依赖对象的域。共享意味着变量可以由多个线程同时访问,而可变则意味着变量的值在其生命周期内可以变化。一个对象是否线程安全,取决于它是否被多个线程访问。这指的是在程序中访问对象的方式,而不是对象要实现的...原创 2018-02-24 20:05:11 · 188 阅读 · 0 评论 -
Java之异常基础
在Java中,如果某个方法不能够采用正常的途径完成它的任务,就可以通过另一个路径退出方法。在这种情况下,方法并不返回任何值,而是throw一个封装了错误信息的对象。需要注意的是,这个方法将会立刻退出,并不返回任何值。此外,调用这个方法的代码也将无法继续执行,而是,异常处理机制开始搜索能够处理这种异常状况的异常处理器。1.1 异常分类在Java程序中,异常对象都是派生于Throwable类的一个实例...原创 2018-03-02 21:06:20 · 164 阅读 · 0 评论 -
Java并发读书学习笔记(五)——任务执行
大多数并发应用程序都是围绕“任务执行”来构造的:任务通常是一些抽象且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。5.1 在线程中执行任务当围绕“任务执行”来设计程序结构时,第一步就是要找出清晰的任务边界。在理想的情况下,各个任务之间是相互独立的:任务并不依赖其他任务的状态、结果或...原创 2018-03-09 22:34:37 · 175 阅读 · 0 评论 -
Java并发读书学习笔记(七)——线程池
7.1 任务与执行策略之间的隐性耦合Executor框架可以将任务的提交与任务的执行策略解耦开,但这种说法有点言过其实。虽然Executor为制定和执行策略都提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。有些类型的任务需要明确地指定执行策略,包括:依赖性任务;使用线程封闭机制的任务;对响应时间敏感的任务;使用ThreadLocal的任务。7.1.1 线程饥饿死锁在线程池中,如果任务...原创 2018-03-15 23:06:38 · 207 阅读 · 0 评论 -
Java并发读书学习笔记(十一)——原子变量与非阻塞同步机制
与基于锁的方案相比,非阻塞算法在实现上要复杂得多,但它在可伸缩性和活跃性上都有巨大的优势。由于非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次上进行协调,并极大地减少调度开销。而且,在非阻塞算法中不存在死锁和其他活跃性问题。在基于锁的算法中,如果一个线程在休眠或自旋的同时持有一个锁,那么其他线程都无法执行下去,而非阻塞算法不会受到单个线程失败的影响。可以使用原子变量...原创 2018-04-02 23:45:29 · 208 阅读 · 0 评论