一 前言

  前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 、AQS的设计与实现)在前面已经简单介绍过了。今天记录下JUC包下的锁是怎么基于AQS上实现的

二 同步锁

  同步锁不是JUC中的锁但也顺便提下,它是由synchronized 关键字进行同步,实现对竞争资源互斥访问的锁。

  同步锁的原理:对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。在同一个时间点该同步锁能且只能被一个线程获取到,其他线程都得等待。

  另外:synchronized是Java中的关键字且是内置的语言实现;它是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;synchronized等待的线程会一直等待下去,不能响应中断。

三 JUC中的锁结构

  相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁(它由自己实现、需要手动释放锁、能响应中断、可以多线程跑提高效率等)。下图是根据源码中查出画的类图,便知它提供的锁有好几种,下面一一分析。

四 可重入锁-ReentrantLock

  重入锁ReentrantLock,顾名思义:就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。另外该锁孩纸获取锁时的公平和非公平性选择,所以它包含公平锁与非公平锁(它们两也可以叫可重入锁)。首先提出两个疑问:它怎么实现重进入呢?释放逻辑还跟AQS中一样吗?

非公平锁

    final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
// 同步状态已经被其他线程占用,则判断当前线程是否与被占用的线程是同一个线程,如果是同一个线程则允许获取,并state+1
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}

  该方法增加了再次获取同步状态的处理逻辑:通过判断当前线程是否为获取锁的线程来决定获取操作是否成功。如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,表示获取同步状态成功。

protected final boolean tryRelease(int releases) {
int c = getState() - releases;
if (Thread.currentThread() != getExclusiveOwnerThread())
throw new IllegalMonitorStateException();
boolean free = false;
if (c == 0) {
free = true;
setExclusiveOwnerThread(null);
}
setState(c);
return free;
}

  上面代码是释放锁的代码。如果该锁被获取了n次,那么前(n-1)次都是返回false,直至state=0,将占有线程设置为null,并返回true,表示释放成功。

公平锁

  公平锁与非公平锁有啥区别呢? 还是从源码中分析吧。

protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
// 区别:增加判断同步队列中当前节点是否有前驱节点的判断
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
// 一样支持重入
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}

  与非公平锁的唯一不同就是增加了一个判断条件:判断同步队列中当前节点是否有前驱节点的判断,如果方法返回true,则表示有线程比当前线程更早地请求获取锁,因此需要等待前驱线程获取并释放锁之后才能继续获取锁。

公平锁与非公平锁的区别

  从上面源码中得知,公平性锁保证了锁的获取按照FIFO原则,但是代价就是进行大量的线程切换。而非公平性锁,可能会造成线程“饥饿”(不会保证先进来的就会先获取),但是极少线程的切换,保证了更大的吞吐量。下面我们看下案例:

import org.junit.Test;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class FairAndUnfairTest {
private static Lock fairLock = new ReentrantLock2(true);
private static Lock unFairLock = new ReentrantLock2(false); @Test
public void fair() throws Exception{
testLock(fairLock);
} @Test
public void unFairLock() throws Exception{
testLock(unFairLock);
} private static void testLock(Lock lock) throws InterruptedException, ExecutionException {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
List<Future<Long>> list = new ArrayList<>();
for (int i = 0 ; i < 5; i++) {
Future<Long> future = threadPool.submit(new Job(lock));
list.add(future);
}
long cost = 0;
for (Future<Long> future : list) {
cost += future.get();
}
// 查看五个线程所需耗时的时间
System.out.println("cost:" + cost + " ms");
} private static class Job implements Callable<Long> {
private Lock lock;
public Job(Lock lock) {
this.lock = lock;
}
@Override
public Long call() throws Exception {
long st = System.currentTimeMillis();
// 同一线程获取100锁
for (int i =0; i < 100; i ++) {
lock.lock();
try {
System.out.println("Lock by[" + Thread.currentThread().getId() + "]," +
"Waiting by[" + printThread(((ReentrantLock2)lock).getQueuedThreads()) + "]");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// 返回100次所需的时间
return System.currentTimeMillis() - st;
} private String printThread(Collection<Thread> list) {
StringBuilder ids = new StringBuilder();
for (Thread t : list) {
ids.append(t.getId()).append(",");
}
return ids.toString();
}
} private static class ReentrantLock2 extends ReentrantLock {
public ReentrantLock2(boolean fair) {
super(fair);
} public Collection<Thread> getQueuedThreads() {
List<Thread> arrayList = new ArrayList<>(super.getQueuedThreads());
Collections.reverse(arrayList);
return arrayList;
}
}
}

  非公平性锁的测试结果,cost:117 ms

Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[10],Waiting by[]
Lock by[10],Waiting by[9,]
Lock by[10],Waiting by[9,]
Lock by[10],Waiting by[9,11,]
Lock by[10],Waiting by[9,11,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[13],Waiting by[9,]
Lock by[13],Waiting by[9,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
cost:117 ms

  公平性锁的测试结果,cost:193 ms

Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[15],Waiting by[]
Lock by[14],Waiting by[15,]
Lock by[15],Waiting by[14,]
Lock by[14],Waiting by[15,]
Lock by[15],Waiting by[14,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,18,]
Lock by[14],Waiting by[15,18,17,]
Lock by[15],Waiting by[18,17,14,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,18,]
Lock by[14],Waiting by[15,18,17,]
Lock by[15],Waiting by[18,17,14,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
cost:193 ms

五 读写锁

  读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁(同一时刻只允许一个线程进行访问)有了很大的提升。

  下面我们看下它有啥特性:

特性

说明

公平性选择

支持非公平(默认)和公平的所获取方式,吞吐量还是非公平优于公平

可重入

该锁支持可重进入。

读线程在获取了读锁之后能够再次获取读锁。

写线程在获取了写锁之后能够再次获取写锁。

锁降级

遵循获取写锁、获取读锁在释放写锁的次序,写锁能够降级成读锁。

排他性

当写线程访问时,其他读写线程均被阻塞

  另外读写锁是采取一个整型变量来维护多种状态。高16位表示读,低16位表示写。

// 偏移位
static final int SHARED_SHIFT = 16;
static final int SHARED_UNIT = (1 << SHARED_SHIFT);
// 读写线程允许占用的最大数
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1;
// 独占标志
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;

  下面从源码中找出这些特性,先看下写锁的实现:

 protected final boolean tryAcquire(int acquires) {

     Thread current = Thread.currentThread();
int c = getState();
// 表示独占个数,也就是与低16为进行与运算。
int w = exclusiveCount(c);
if (c != 0) {
// c!=0 且 w==0表示不存在写线程,但存在读线程
if (w == 0 || current != getExclusiveOwnerThread())
return false;
if (w + exclusiveCount(acquires) > MAX_COUNT)
throw new Error("Maximum lock count exceeded");
/**
* 获取写锁的条件:
* 不能存在读线程且当前线程是当前占用锁的线程(这里体现可重入性和排他性);
* 当前占用锁的次数不能超过最大数
*/
setState(c + acquires);
return true;
}
if (writerShouldBlock() ||
!compareAndSetState(c, c + acquires))
return false;
setExclusiveOwnerThread(current);
return true;
}
static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }

  获取读锁源码如下:

protected final int tryAcquireShared(int unused) {
Thread current = Thread.currentThread();
int c = getState();
/**
* exclusiveCount(c) != 0: 表示有写线程在占用
* getExclusiveOwnerThread() != current : 当前占用锁的线程不是当前线程。
* 如果上面两个条件同时满足,则获取失败。
* 上面表明如果当前线程是拥有写锁的线程可以获取读锁(体现可重入和锁降级)。
*/
if (exclusiveCount(c) != 0 &&
getExclusiveOwnerThread() != current)
return -1;
int r = sharedCount(c);
if (!readerShouldBlock() &&
r < MAX_COUNT &&
compareAndSetState(c, c + SHARED_UNIT)) {
if (r == 0) {
firstReader = current;
firstReaderHoldCount = 1;
} else if (firstReader == current) {
firstReaderHoldCount++;
} else {
HoldCounter rh = cachedHoldCounter;
if (rh == null || rh.tid != getThreadId(current))
cachedHoldCounter = rh = readHolds.get();
else if (rh.count == 0)
readHolds.set(rh);
rh.count++;
}
return 1;
}
return fullTryAcquireShared(current);
}

Java并发编程(3) JUC中的锁的更多相关文章

  1. Java并发编程系列-(4) 显式锁与AQS

    4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...

  2. [转载] java并发编程:Lock(线程锁)

    作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...

  3. 并发编程---线程 ;python中各种锁

    一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...

  4. java并发编程:线程同步和锁

    一.锁的原理 java中每个对象都有一个内置锁.当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this)有关的锁.获得一个对象的锁也称为获取锁,当程序运 ...

  5. 整理一下《java并发编程实战》中的知识点

    分工.同步.互斥的历史由来 分工:单道.多道.分时 同步:线程通信(组织编排任务) 互斥:因(多线程访问共享资源)果(串行化共享资源的访问) 1切都是为了提高性能 2.可见性.原子性.有序性 可见性: ...

  6. 【Java并发编程】2、无锁编程:lock-free原理;CAS;ABA问题

    转自:http://blog.csdn.net/kangroger/article/details/47867269 定义 无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步.即在没有线程 ...

  7. 【JAVA并发编程实战】8、锁顺序死锁

    package cn.study.concurrency.ch10; public class Account { private String staffAccount; //账号 private ...

  8. 【Java并发编程】8、各种锁的概念

    持续更新中... 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁.获准共享锁的事务只能读数据,不能修改数据. 排他锁(X锁):如果事务 ...

  9. 【JAVA并发编程实战】9、锁分段

    package cn.study.concurrency.ch11; /** * 锁分段 * @author xiaof * */ public class StripedMap { //同步策略:就 ...

随机推荐

  1. Shopping Bands Rank & SBR

    Shopping Bands Rank SBR https://www.guiderank.org/index.html Nike Air Zoom Pegasus 34 http://www.shi ...

  2. 【刷题】BZOJ 3669 [Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  3. 【刷题】BZOJ 5008 方师傅的房子

    Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...

  4. Storm入门到精通(四)---本地实例Demo

    单词实时计数 maven项目的结构: 一.Pom.xml [html] view plain copy <project xmlns="http://maven.apache.org/ ...

  5. 51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题

    51nod 1563 坐标轴上的最大团 坐标轴上有n个点,每个点有一个权值.第i个点的坐标是 xi ,权值是 wi .现在对这些点建图.对于点对 (i,j) ,如果 |xi−xj|≥wi+wj ,那么 ...

  6. CH暑假欢乐赛 SRM 07 天才麻将少女KPM(DP+treap)

    首先LIS有个$O(n^2)$的DP方法 $f(i,j)$表示前i个数,最后一个数<=j的LIS 如果$a_i!=0$则有 如果$a_i=0$则有 注意因为$f(i-1,j)\leq f(i-1 ...

  7. Struts2的配置文件中, <package>的作用,<action><result>重名?

    问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...

  8. P2042 [NOI2005]维护数列 && Splay区间操作(四)

    到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...

  9. Hadoop生态圈-Hbase的Region详解

    Hadoop生态圈-Hbase的Region详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  10. node.js如何让前端请求时能跨域

    1995年,Netscape提出了一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同. 当一个浏览器的两个tab页中分别打开来 百度和谷 ...