重入锁理解

概念简述

重入锁简单点说就是一个线程可以重复拥有同一把锁,如下代码示例

public class TestReetrantLock {
	/*创建锁*/
	private static Lock lock = new ReentrantLock();
	
	public static void test() {
		/*第一次获取锁*/
		lock.lock();
		for (int i = 0; i < 10; i++) {
			/*第二次获取锁*/
			lock.lock();
			System.out.println(i);
			/*第一次释放锁*/
			lock.unlock();
		}
		/*第二次释放锁*/
		lock.unlock();
	}
	
	/*测试*/
	public static void main(String[] args) {
		for (int i = 0; i < 2;i++){
			new Thread(new Runnable() {
				
				public void run() {
					test();
				}
				
			}).start();
		}
	} 
	
}

哪些是重入锁

①关键字synchronized

②ReentrantLock

特点

线程获取多少次锁,那么就需要释放多少次锁,否则锁未释放,导致线程阻塞。

如下代码所示

public class TestReetrantLock {
	/*创建锁*/
	private static Lock lock = new ReentrantLock();
	
	public static void test() {
		/*第一次获取锁*/
		lock.lock();
		for (int i = 0; i < 10; i++) {
			/*第二次获取锁*/
			lock.lock();
			System.out.println(i);
			/*不对第二把锁进行释放*/
//			lock.unlock();
		}
		/*第二次释放锁*/
		lock.unlock();
	}
	
	/*测试*/
	public static void main(String[] args) {
		for (int i = 0; i < 2;i++){
			new Thread(new Runnable() {
				
				public void run() {
					test();
				}
				
			}).start();
		}
	} 
	
}

执行结果会导致线程阻塞。

总结

在线程多次使用同一把锁的时候,如果使用的关键字synchronized,则不用各位理会,锁机制交给了jvm去管理,但是如果是使用的ReentrantLock那么一定注意释放锁。

猜你喜欢

转载自blog.csdn.net/ly853602/article/details/79855028