可重入锁:可以对一个ReentrantLock对象多次执行lock()枷锁和unlock()释放锁。
核心结构
// 等待队列,专门存放那些加锁的线程
// 等待队列的头,已延迟初始化。除了初始化,它只能通过方法sethead进行修改。注意:如果head存在,则保证其waitstatus不会被取消
private transient volatile Node head;
// 等待队列的尾部,已延迟初始化。仅通过方法enq修改以添加新的等待节点。
private transient volatile Node tail;
// 同步状态。可重入锁的核心,lock()+1,unlock()-1。
private volatile int state;
原子性自增demo
public class AtomicityLock {
private int count = 0;
Lock lock = new ReentrantLock();
private void increase() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Long time = System.currentTimeMillis();
final AtomicityLock atomicityLock = new AtomicityLock();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 10000000; j++) {
atomicityLock.increase();
}
}
}).start();
}
while (Thread.activeCount() > 1) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("运行时间:" + (System.currentTimeMillis() - time));
System.out.println("ReentrantLock(可重入锁):" + atomicityLock.count);
}
}