Java 可重入锁实现原子性自增(ReentrantLock)

可重入锁:可以对一个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

github地址

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);
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_27243963/article/details/94746495