上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放。 AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断。 acquireInterruptibly(int arg): 以独占模式获取对象,如果被中断则中止。 acquireShared(int arg): 以共享模式获取对象,忽略中断。 acquireSharedInterruptibly(int arg)以共享模式获取对象,如果被中断则中止。 tryAcquire(int arg):试图在独占…

2015年12月24日 0条评论 8点热度 阅读全文

在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列。他能够确保无饥饿,严格的先来先服务的公平性。下图是CLH队列节点的示意图: 在CLH队列的节点QNode中包含有一个locked的字段,该字段表示该节点是否需要获取锁,为true表示需要获取,为false表示不需要获取。在CLH队列中,节点与节点之间并不是通过next指针来连接的而是通过myPred所指向节点的变化情况来影响的myNode的行为。 假设有两个线程(线程A、线程B)。开始线程A需要获得锁,那么他会创建…

2015年12月10日 0条评论 4点热度 阅读全文

在java中有两种方法实现锁机制,一种是在前一篇博客中(【java7并发编程实战】—–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强大和领过的Lock。Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区,相对于synchronized,Lock接口及其实现类提供了更加强大、灵活的锁机制。 一个简单的锁 在使用synchronized时,我们是这样使用锁的: public class ThreadTest { public void t…

2015年8月10日 0条评论 11点热度 阅读全文