Java 可重入锁 & 不可重入锁
概述
- 可重入锁:指可以重复使用的同步锁。如:synchronized、Lock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock。
- 不可重入锁:指不可以重复使用的同步锁。需要自定义锁。
论证synchronized是可重入锁:
public class Demo {
public static void main(String[] args) {
synchronized (Demo.class) {
System.out.println("第一次获取锁");
synchronized (Demo.class) {
System.out.println("第二次获取锁");
}
}
}
}
输出:
第一次获取锁
第二次获取锁
论证Lock是可重入锁:
public class Demo {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
lock.lock();
try {
System.out.println("第一次获取锁");
lock.lock();
try {
System.out.println("第二次获取锁");
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
}
}
输出:
第一次获取锁
第二次获取锁
自定义不可重入锁:
public class Demo {
public static void main(String[] args) {
MyLock lock = new MyLock();
lock.lock();
try {
System.out.println("第一次获取锁");
lock.lock();
try {
System.out.println("第二次获取锁");
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
}
}
class MyLock implements Lock {
//绑定线程
private Thread thread;
@Override
public void lock() {
synchronized (this) {
while (thread != null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.thread = Thread.currentThread();
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
}
@Override
public boolean tryLock() {
return false;
}
@Override
public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException {
return false;
}
@Override
public void unlock() {
synchronized (this) {
if (thread != Thread.currentThread()) {
return;
}
thread = null;
notifyAll();
}
}
@Override
public Condition newCondition() {
return null;
}
}
输出:
第一次获取锁
说明:只输出了一个打印信息,程序就进入等待阶段。
今天的文章Java 可重入锁 & 不可重入锁分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27879.html