- 浏览: 1238066 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
Condition是一个条件功能的class,必须放在Lock代码块内,如同wait,notify方法放在synchronized块一样。
Condition的(await,signal)与object的(wait,notify)相比,提供了更为通用和灵活的解决方案,可以让多种条件的线程之间相互通信。
Condition的定义:
Lock接口的newCondition方法是实现Condition的一种方式,这样Condition就可以和Lock合作得亲密无间。
在AbstractQueuedSynchronizer中也有Condition的实现ConditionObject:
1. ConditionObject.addConditionWaiter 方法
添加一个waiter到等待队列中
如果上一个waiter被取消了,则调用unlinkCancelledWaiters方法去掉队列里面的无效waiters。新建一个waiter并把它放到队列的尾部。
2. ConditionObject.unlinkCancelledWaiters方法
从condition队列中把取消的等待节点删除,目的是为了减少内存占用,提高效率。
从起始节点firstWaiter出发,遍历到结束节点lastWaiter。
值得一提的是trail变量,保存的是上一个有效节点:
a. 如果trail == null,说明还没有有效的节点,所以把next节点暂且作为firstWaiter
b. 如果当前节点t无效,则把t剔除出列(t.nextWaiter = null),并把trail和next暂且关联起来(trail.nextWaiter = next)
c. 当next == null时,说明已经遍历完整个队列了,把trail作为结束节点
3. ConditionObject.doSignal方法
从开始节点开始,向后搜索直到找到一个不为null的等待节点并把它转移到同步队列上。
4. ConditionObject.signal方法
把等待最久的condition节点移到锁的等待队列中。
拿到第一个waiter,如果不为空,则调用doSignal方法。
5. ConditionObject.awaitUninterruptibly方法
首先把当前线程加入到condition的等待队列中,然后试着去释放当前等待节点。循环监测节点是否在锁的等待队列中,如果没有,就park当前线程。
6. ConditionObject.await方法
和awaitUninterruptibly类似,这里允许出现Interrupt。
7. ConditionObject.awaitNanos方法
实现指定时间的等待。
和awaitUninterruptibly类似。每次循环都会检查
Condition的(await,signal)与object的(wait,notify)相比,提供了更为通用和灵活的解决方案,可以让多种条件的线程之间相互通信。
Condition的定义:
public interface Condition{ void await() throws InterruptedException; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; boolean awaitUntil(Date deadline) throws InterruptedException; void signal(); void signalAll(); }
Lock接口的newCondition方法是实现Condition的一种方式,这样Condition就可以和Lock合作得亲密无间。
在AbstractQueuedSynchronizer中也有Condition的实现ConditionObject:
1. ConditionObject.addConditionWaiter 方法
添加一个waiter到等待队列中
private Node addConditionWaiter() { Node t = lastWaiter; // If lastWaiter is cancelled, clean out. if (t != null && t.waitStatus != Node.CONDITION) { unlinkCancelledWaiters(); t = lastWaiter; } Node node = new Node(Thread.currentThread(), Node.CONDITION); if (t == null) firstWaiter = node; else t.nextWaiter = node; lastWaiter = node; return node; }
如果上一个waiter被取消了,则调用unlinkCancelledWaiters方法去掉队列里面的无效waiters。新建一个waiter并把它放到队列的尾部。
2. ConditionObject.unlinkCancelledWaiters方法
从condition队列中把取消的等待节点删除,目的是为了减少内存占用,提高效率。
private void unlinkCancelledWaiters() { Node t = firstWaiter; Node trail = null; while (t != null) { Node next = t.nextWaiter; if (t.waitStatus != Node.CONDITION) { t.nextWaiter = null; if (trail == null) firstWaiter = next; else trail.nextWaiter = next; if (next == null) lastWaiter = trail; } else trail = t; t = next; } }
从起始节点firstWaiter出发,遍历到结束节点lastWaiter。
值得一提的是trail变量,保存的是上一个有效节点:
a. 如果trail == null,说明还没有有效的节点,所以把next节点暂且作为firstWaiter
b. 如果当前节点t无效,则把t剔除出列(t.nextWaiter = null),并把trail和next暂且关联起来(trail.nextWaiter = next)
c. 当next == null时,说明已经遍历完整个队列了,把trail作为结束节点
3. ConditionObject.doSignal方法
从开始节点开始,向后搜索直到找到一个不为null的等待节点并把它转移到同步队列上。
private void doSignal(Node first) { do { if ( (firstWaiter = first.nextWaiter) == null) lastWaiter = null; first.nextWaiter = null; } while (!transferForSignal(first) && (first = firstWaiter) != null); }
4. ConditionObject.signal方法
把等待最久的condition节点移到锁的等待队列中。
public final void signal() { if (!isHeldExclusively()) throw new IllegalMonitorStateException(); Node first = firstWaiter; if (first != null) doSignal(first); }
拿到第一个waiter,如果不为空,则调用doSignal方法。
5. ConditionObject.awaitUninterruptibly方法
public final void awaitUninterruptibly() { Node node = addConditionWaiter(); int savedState = fullyRelease(node); boolean interrupted = false; while (!isOnSyncQueue(node)) { LockSupport.park(this); if (Thread.interrupted()) interrupted = true; } if (acquireQueued(node, savedState) || interrupted) selfInterrupt(); }
首先把当前线程加入到condition的等待队列中,然后试着去释放当前等待节点。循环监测节点是否在锁的等待队列中,如果没有,就park当前线程。
6. ConditionObject.await方法
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); int savedState = fullyRelease(node); int interruptMode = 0; while (!isOnSyncQueue(node)) { LockSupport.park(this); if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; if (node.nextWaiter != null) unlinkCancelledWaiters(); if (interruptMode != 0) reportInterruptAfterWait(interruptMode); }
和awaitUninterruptibly类似,这里允许出现Interrupt。
7. ConditionObject.awaitNanos方法
public final long awaitNanos(long nanosTimeout) throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); int savedState = fullyRelease(node); long lastTime = System.nanoTime(); int interruptMode = 0; while (!isOnSyncQueue(node)) { if (nanosTimeout <= 0L) { transferAfterCancelledWait(node); break; } LockSupport.parkNanos(this, nanosTimeout); if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; long now = System.nanoTime(); nanosTimeout -= now - lastTime; lastTime = now; } if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; if (node.nextWaiter != null) unlinkCancelledWaiters(); if (interruptMode != 0) reportInterruptAfterWait(interruptMode); return nanosTimeout - (System.nanoTime() - lastTime); }
实现指定时间的等待。
和awaitUninterruptibly类似。每次循环都会检查
发表评论
-
AtomicReferenceFieldUpdater 使用
2014-11-19 22:13 3181AtomicReferenceFieldUpdater位于ja ... -
LockSupport 分析
2014-08-03 21:26 0LockSupport 构造器是私有的,外界主要通过LockS ... -
AtomicInteger 使用
2014-08-02 22:57 3400Java中,i++和++i都不是原子操作,多线程环境下需要 ... -
死锁系列之一:模拟
2014-07-20 18:12 0死锁产生的原因是: 1. 多个线程以不同的顺序来锁共享资源 2 ... -
Java线程死锁检测
2014-07-20 12:55 0public class DeadlockDetector ... -
LinkedBlockingDeque 源码分析
2013-04-01 16:04 1976LinkedBlockingDeque是LinkedL ... -
ExecutorService 分析
2013-03-26 18:37 2312public interface ExecutorServ ... -
Exchanger 源码分析
2013-01-29 12:35 0private Object doExchange ... -
ConcurrentHashMap 源码分析
2013-01-29 10:34 0static final int MAX_SEGM ... -
Executors 源码分析
2012-11-06 16:11 0类图: 1. 在任务的方法里面调用ExecutorServ ... -
ScheduledExecutorService 源码分析
2013-03-27 18:08 3791public interface ScheduledExe ... -
3. 共享对象
2012-05-22 11:38 0本章讲述防止多个线程同时访问某个对象。 -
LockSupport 的使用
2012-04-23 16:36 01. park方法 public static ... -
AbstractQueuedSynchronizer(3)
2012-04-20 09:28 0final boolean transferAft ... -
java concurrent (1) - 传统线程互斥和通信
2012-04-19 13:40 1880线程互斥是一次只有一个线程执行某段代码,保证数据的一致性。线程 ...
相关推荐
framework based on class AbstractQueuedSynchronizer. This framework provides common mechanics for atomically managing synchronization state, blocking and unblocking threads, and queuing. The paper ...
AbstractQueuedSynchronizer.java
主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java锁之AbstractQueuedSynchronizer,队列同步器实现锁或其它相关同步类的基础类
ReentrantLock Lock 加锁过程源码分析图,AQS 源码分析
主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本篇文章主要介绍了Java同步框架AbstractQueuedSynchronizer详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
并以java锁机制实现基类AbstractQueuedSynchronizer的实现为例,从类(核心属性、方法)设计思路,到对关键代码做注释分析,再到以流程图方式直观解释流程;最后介绍了AbstractQueuedSynchronizer的应用,即如何用它...
Chinese_AQS 添加中文注释, 重新按业务部门开发工程师的思维角度组织代码中的方法顺序, 使中国程序员轻松理解 AbstractQueuedSynchronizer;
4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗? 7.三大性质总结:原子性、可见性以及有序性 8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10....
Java 并发编程在现代软件开发中占据重要地位,尤其是在多核处理器的时代。JUC(java.util.concurrent)库是 Java ...4. 同步器(Synchronizers):JUC 中的同步器主要通过 AQS(AbstractQueuedSynchronizer)提供支持。
解析AbstractQueuedSynchronizer这个类中,锁的获取、释放的相关逻辑。
AbstractQueuedSynchronizer(AQS) 简单来说 AQS 会把所有的请求线程构成一个 CLH 队列,当一个线程执行完毕 (lock.unlock())时会激活自己的后继节点,但正在执行的线程并不在队列中, 而那些等待执行的线程全部...
java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过调用 LockSupport .park()和 LockSupport .unpark()实现线程的阻塞和唤醒 的。 LockSupport 很类似于二元信号量(只有1个许可证可供使用),如果...
Java 并发编程中的 JUC(java.util.concurrent)库以及其核心组件 AQS(AbstractQueuedSynchronizer)在构建高性能、可伸缩性的多线程应用方面具有重要的地位。 AQS 是 JUC 中的核心组件,它提供了一个框架,让...
而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/...
14.5.AbstractQueuedSynchronizer 190 14.6.AQSinJava.util.concurrentSynchronizerClasses 192 Summary 194 Chapter 15. Atomic Variables and Non-blocking Synchronization 195 15.1.DisadvantagesofLocking 195 ...