可重入锁和不可重入锁
概念区分
当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized
原理分析
不可重入锁的实现:
public class Lock {
private boolean isLocked = false;
public void lock() throws InterruptedException{
while(isLocked){
//如果已经被获取锁,则当前线程只能等待
wait();
}
isLocked = true;
}
public void unLock(){
isLocked = false;
}
}
可重入锁的实例:
public class ReinnerLock {
private boolean isLocked = false;
Thread thread = null;//当前的线程
public void lock() throws InterruptedException{
Thread currentThread = Thread.currentThread();
while(isLocked && thread!=currentThread){
wait();
}
isLocked = true;
thread = currentThread;
}
public void unLock(){
isLocked = false;
}
}
public class LockClient {
// Lock lock = new Lock();
ReinnerLock lock = new ReinnerLock();
void read() throws InterruptedException{
lock.lock();
System.out.println(“read”);
read1();
lock.unLock();
}
void read1() throws InterruptedException{
lock.lock();
System.out.println(“read1”);
lock.unLock();
}
public static void main(String[] args) {
try {
//此时执行结果为 read和read1都能打印出来
//如果使用的锁是 Lock则报IllegalMonitorStateException
new LockClient().read();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
今天的文章可重入锁和不可重入锁分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/25212.html