// java.util.concurrent.locks.Lock接口 // 能够响应中断 void lockInterruptibly() throws InterruptedException; // 支持超时(同时也能够响应中断) boolean tryLock(long time, TimeUnit unit) throws InterruptedException; // 非阻塞地获取锁 boolean tryLock();
public class Counter {
private final Lock lock = new ReentrantLock();
private int value;
public void addOne() {
// 获取锁
lock.lock();
try {
// 可见性:线程T1执行value++,后续的线程T2能看到正确的结果
value++;
} finally {
// 释放锁
lock.unlock();
}
}
}
// ReentrantLock的伪代码
public class SimpleLock {
// 利用了volatile相关的Happens-Before规则
private volatile int state;
// 加锁
public void lock() {
// 读取state
state = 1;
}
// 解锁
public void unlock() {
// 读取state
state = 0;
}
}
value++
Happens-Before unlock()
lock()
Happens-Before 读取value
state=1
public class X {
private final Lock lock = new ReentrantLock();
private int value;
private int get() {
lock.lock(); // 2
try {
return value;
} finally {
lock.unlock();
}
}
public void addOne() {
lock.lock();
try {
value = get() + 1; // 1
} finally {
lock.unlock();
}
}
}
// java.util.concurrent.locks.ReentrantLock
public ReentrantLock() {
// 默认非公平锁
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
转载请注明出处:http://zhongmingmao.me/2019/05/05/java-concurrent-lock-condition/
访问原文「 Java并发 -- Lock + Condition 」获取最佳阅读体验并参与讨论