Java多线程之可重入锁概念
一、什么是可重入锁
在java中,可重入锁分为两种,即synchronized锁以及ReentrantLock及其实现。那么,什么是重入锁呢,其实重入锁就是
一个线程能否获取一个已经由它自己持有的锁
。如果可以,就是可重入锁,否则为不可重入锁。它的作用就是能够避免重复获取的时候出现死锁。
二、demo
1、synchronized
public class ReentrantSynchronizer {
public synchronized void print() {
System.out.println(Thread.currentThread().getName());
printf();
}
public synchronized void printf() {
System.out.println(Thread.currentThread().getName());
print();
}
public static void main(String[] args) {
ReentrantSynchronizer reentrantSynchronizer = new ReentrantSynchronizer();
for (;;){
reentrantSynchronizer.print();
}
}
}
以上的demo就是测试synchronized的可重入性质,方法一中调用方法二,方法二又调用方法一,即结构类似于
synchronized(this){
synchronized(this){
}
}
结果:
main
main
main
main
main
main
...
证明
synchronized是可重入锁
。
2、UnReentrantLock
这里用一个demo来模拟不可重入锁的特性,事实上,在JUC中都是重入锁。
public class UnReentrantLock {
private AtomicReference<Thread> owner = new AtomicReference<>();
public void lock() {
Thread current = Thread.currentThread();
for (; ; ) {
if (owner.compareAndSet(null, current)) {
System.err.println("EXIT");
return;
}
}
}
public void unlock() {
Thread current = Thread.currentThread();
owner.compareAndSet(current, null);
}
public static void main(String[] args) {
UnReentrantLock unReentrantLock=new UnReentrantLock();
unReentrantLock.lock();
//unReentrantLock.unlock();
//连续两次执行lock就会造成死锁
unReentrantLock.lock();
}
}
上面我们可以看到,不可重入锁如果同一线程连续调用两次,就会造成死锁。
3、ReentrantLock
这是一个JUC的可重入锁,具体的demo 测试就交给你们去动手了,比较简单,连续两次lock看看就行。
三、总结
- 可重入锁、不可重入锁,针对的对象是同一线程。
- 对于可重入锁,获取了该锁的线程可以重复获取该锁,不会造成死锁。
- 而不可重入锁,获取该锁的线程再获取该锁的时候,会等待对方释放,造成死锁。
版权声明:本文为rekingman原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。