《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并发编程实践读书笔记六)

可取消的任务:外部代码能够在任务自然完成之前,把他更改为完成状态。 取消策略 :一个可取消的任务必须拥有取消策略  策略主要说明 其他代码如何取消该任务。例:在任务中提供public...
  • wbean
  • wbean
  • 2011年11月17日 23:35
  • 1372

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

第4章 对象的组合 在Java中,同步经常是与状态挂钩的,想要实现等待某个先验条件为真时才执行的操作,可以通过Java库中的一些阻塞类,例如BlockingQueue, Semaphore以及其他同...

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

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

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

第6章 任务执行 大部分并发应用程序都是围绕“任务执行(Task Execution)”来构造,任务通常是一些抽象的且离散的工作单元。 在线程中执行任务,既不能让服务器串行地工作在单线程下,但同时...

为计算机结果建立高效,可伸缩的的高速缓存(java并发编程实践读书笔记四)

复用已有的计算结果,缩短等待时间,提高吞吐量,代价是占用更多的内存 经典思路:使用一个map,每次计算先在map中查找,找不到的情况下进行计算,把计算结果保存到map中,以便下次计算相同值时直接从ma...
  • wbean
  • wbean
  • 2011年11月12日 19:59
  • 992

阻塞队列 生产者-消费者模式 窃取工作模式(java并发编程实践读书笔记二)

阻塞队列 生产者-消费者模式 窃取工作模式     生产者-消费者模式         简化了开发,因为它解除了生产者类和消费者类之间相互依赖的代码;解耦不同速度的生产,消费等活动。      ...
  • wbean
  • wbean
  • 2011年11月10日 10:23
  • 3646

Java并发编程实践读书笔记(二)

Semaphore 定义一个Semaphore: Semaphore available = new Semaphore(5, true); //true定义为开始有5个可用的初始同步器 P 原...

《Java并发编程实战》读书笔记五:深入理解同步实现

博文目录一、构建自定义的同步工具 - 1. 内置的条件队列 - 2. Condition对象 - 3. AbstractQueuedSynchronizer(AQS)(重点) - 4. jav...
  • jeffleo
  • jeffleo
  • 2016年12月28日 00:15
  • 339

使用Executor代替手动的线程调度(java并发编程读书笔记五)

不使用Executor线程池: 单线程:顺序的执行任务不能提供良好的吞吐量或者快速的响应性 每任务每线程:大量线程创建,销毁,线程间切换的开销巨大,高负载下容易崩溃 Executor是基于 生...
  • wbean
  • wbean
  • 2011年11月15日 10:30
  • 1151
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《JAVA并发编程实践》读书笔记(五)
举报原因:
原因补充:

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