- 浏览: 1248600 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 3237AtomicReferenceFieldUpdater位于ja ... -
LockSupport 分析
2014-08-03 21:26 0LockSupport 构造器是私有的,外界主要通过LockS ... -
AtomicInteger 使用
2014-08-02 22:57 3455Java中,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 2017LinkedBlockingDeque是LinkedL ... -
ExecutorService 分析
2013-03-26 18:37 2372public 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 3890public 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 1919线程互斥是一次只有一个线程执行某段代码,保证数据的一致性。线程 ...
相关推荐
framework based on class AbstractQueuedSynchronizer. This framework provides common mechanics for atomically managing synchronization state, blocking and unblocking threads, and queuing. The paper ...
在Java并发编程中,`AbstractQueuedSynchronizer`(AQS)是一个重要的抽象类,用于构建锁和其他同步组件。AQS的核心是通过一个整型变量`state`来表示同步状态,并利用双端队列(FIFO)管理等待的线程。在本篇中,我们...
AbstractQueuedSynchronizer.java
这是 jdk 6u11 的jre 解压以后得到的 rt.jar, 将rt.jar 解压获得了 AbstractQueuedSynchronizer.class 文件
**4. AQS的线程调度与并发控制** AQS使用非阻塞的CAS操作(Compare And Swap)来保证线程安全地竞争和转移同步状态,避免了传统锁的死锁和资源竞争问题。线程在加入队列、等待和被唤醒的过程中,AQS会进行一系列的...
这是 jdk 6u11 的jre 解压以后得到的 rt.jar, 将rt.jar 解压获得了 AbstractQueuedSynchronizer.Node.class 文件
4. **等待队列中的竞争(acquireQueued):** 进入队列的线程并不会立即阻塞,而是会尝试变为阻塞状态。在`acquireQueued()`方法中,线程会循环检查是否能够获取锁。如果当前线程是队首结点,会再次尝试`tryAcquire...
Java锁之AbstractQueuedSynchronizer,队列同步器实现锁或其它相关同步类的基础类
ReentrantLock Lock 加锁过程源码分析图,AQS 源码分析
Java同步框架AbstractQueuedSynchronizer详解 AbstractQueuedSynchronizer(AQS)是Java中的一个同步框架类,它实现了最核心的多线程同步的语义。AQS提供了一个基础的同步器实现,开发者可以通过继承AQS来实现自己...
《Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)》 AbstractQueuedSynchronizer(AQS)是Java并发编程中一个重要的工具,它是Java并发包`java.util.concurrent.locks`中的核心抽象类,用于构建锁...
并以java锁机制实现基类AbstractQueuedSynchronizer的实现为例,从类(核心属性、方法)设计思路,到对关键代码做注释分析,再到以流程图方式直观解释流程;最后介绍了AbstractQueuedSynchronizer的应用,即如何用它...
4. **自定义同步组件**:AQS的一个强大之处在于它可以作为其他同步组件的基础,如ReentrantLock、Semaphore和CountDownLatch等。通过继承AQS并实现其抽象方法,开发者可以创建自己的同步组件,满足特定的并发需求。 ...
4. **扩展性** `AbstractQueuedSynchronizer`的设计允许用户通过继承和覆盖特定的方法来实现不同的同步器。例如,`tryAcquire()`和`tryRelease()`方法分别用于尝试获取和释放同步状态,这些方法可以根据具体的同步...
4-4 AbstractQueuedSynchronizer浅析.mp4 4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及...
4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗? 7.三大性质总结:原子性、可见性以及有序性 8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10....
4-4 AbstractQueuedSynchronizer浅析.mp4 4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及...
4-4 AbstractQueuedSynchronizer浅析.mp4 4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及...
4-4 AbstractQueuedSynchronizer浅析.mp4 4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及...