《JAVA并发编程实践》读书笔记(五)

原创 2016年08月02日 21:20:00

第13章 显式锁

在Java 5.0中增加了一种新的机制 :ReentrantLock。

13.1 Lock 与 ReentrantLock
Lock提供了一种无条件、可轮询、定时的以及可中断的锁获取操作。
public interface Lock{
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}

防止死锁的唯一方法是避免出现不一致的锁顺序,可定时的与可轮询的锁提供了另外一种选择:避免死锁的发生。—-》tryLock
内置锁的阻塞机制让实现可取消的任务变得复杂, lockInterruptibly可以保持对中断的响应。

ReentrantLock 提供了两种公平性的选择,默认非公平的锁,或者一个公平的锁。非公平的锁允许插队,如果在发出请求到该锁的状态变成可用,则这个线程可以跳过队列中的所有等待线程直接获得锁。

13.2 ReadWriteLock

private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w= lock.writeLock();

第14章 构建自定义的同步工具
类库包含了许多存在状态依赖性的类,如FutureTask, Semaphore, BlockingQueue等。如果基于某个状态的前置条件未得到满足,这个条件就永远无法为真。在再次测试前提条件的时候,必须重新获得锁。

acquire lock on object state
while(precondition does not hold){
release lock
wait until precondiion might hold
optionally fail if interrupted or timeout expires
reacquire lock
}
preform action
release lock

14.1 条件队列
一组线程(称之为等待线程集合)能够通过某种方式来等待特定的条件变成真。
Object.wait, notify和notifyAll 构成了内部条件队列的API。
Object.wait 会自动释放锁,并请求操作系统挂起当前线程,从而其他线程能够获得这个锁并修改对象的状态。当一个线程由于调用notifyAll而醒来时,并不意味该线程正在等待的条件谓词已经成真。
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

14.2 显示的Condition对象
一个Condition和一个Lock是关联在一起的,就像一个条件队列和一个内置锁一样。对于每个Lock,可以有任意数量的Condition对象。
-**在Condition对象中,与wait,notify,notifyAll方法分别对应的是await, signal, signalAll.

14.3 AbstractQueuedSynchronizer

第15章 原子变量与非阻塞同步机制

15.1 CAS

第16章 Java内存模型

《JAVA并发编程实践》读书笔记(一)

《JAVA并发编程实践》读书笔记(一)2016年8月1日,“妮妲”冲击广东,全市放假1天。托“妮妲”的福,终于有空将近期的阅读整理一下。 最近利用业余时间重读了Brian Goetz的书,觉得受益匪...
  • youngweiquan
  • youngweiquan
  • 2016年08月02日 01:04
  • 724

《Java并发编程实战》读书笔记

Subsections  线程安全(Thread safety) 锁(lock) 共享对象 对象组合 基础构建模块 任务执行 取消和关闭 线程池的使用 性能与可伸缩性 并发程序的测试 显示锁 原子变量...
  • cdl2008sky
  • cdl2008sky
  • 2014年05月20日 17:02
  • 24752

Java并发编程实战--读书笔记(目录)

一、重点章节摘录 1、 闭锁 CountDownLatch 2、FutureTask 3、计数信号量(Semaphore) 4、 事实不可变对象 5、协作对象间的死锁与开放调用 6、通过线...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2017年06月08日 08:04
  • 581

《java并发编程实战》读书笔记——并发应用

1.使用线程池 当应用需要处理多个任务时,例如一个Web服务器处理它接收到的请求,可以使用线程池。 通过重用现有的线程而不是创建新的线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。...
  • Great_Smile
  • Great_Smile
  • 2016年01月06日 22:11
  • 1056

《JAVA并发编程实践》读书笔记(五)

第10章 避免活跃性危险 如果所有的线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁的问题。10.1 锁顺序死锁 如果存在嵌套的锁获取操作,则很容易发生动态的锁顺序死锁。如果可能出现这种...
  • youngweiquan
  • youngweiquan
  • 2016年08月02日 20:43
  • 126

JAVA并发编程实践 中英文ebook

[Java并发编程实践].(Java.Concurrency.in.Practice).Brian.Goetz.文字版(1).pdf [JAVA并发编程实践].扫描版.pdf...
  • Cloud_Strife_1985
  • Cloud_Strife_1985
  • 2017年07月23日 18:54
  • 236

《Java并发编程实践》笔记6——并发性调优

1.Amdahl定律: Amdahl(阿姆达尔)定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少。若F是必须串行化执行的比重,那么在一...
  • chjttony
  • chjttony
  • 2015年07月01日 14:52
  • 3102

Java并发编程实践笔记(一)

Collections.synchronizedList
  • chunqiuwei
  • chunqiuwei
  • 2014年04月17日 16:51
  • 1879

《Java并发编程实战》第十六章 Java内存模型 读书笔记

Java内存模型是保障多线程安全的根基,这里仅仅是认识型的理解总结并未深入研究。 一、什么是内存模型,为什么需要它 Java内存模型(Java Memory Model)并发相关的安全...
  • love_world_
  • love_world_
  • 2014年06月05日 07:58
  • 1547

Java并发编程实践 读书笔记

xx
  • onlyForCloud
  • onlyForCloud
  • 2015年06月18日 17:08
  • 229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《JAVA并发编程实践》读书笔记(五)
举报原因:
原因补充:

(最多只允许输入30个字)