今天就跟大家聊聊有关synchronized和ReentrantLock可重入锁验证的操作方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
一个线程已经获得了一把锁,则可以再多次重复获得这把已经获取的锁而不会发生死锁(可类比生活大门锁示例)。
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。
package com.lau.javabase.lock;
/**
* 隐式锁
*/
public class ReenterSynchronizedTest {
public synchronized void print(){
System.out.println("外层调用...");
//中层调用
print2();
//内层调用
print3();
}
public synchronized void print2(){
System.out.println("中层调用...");
}
public synchronized void print3(){
System.out.println("内层调用...");
}
public static void main(String[] args) {
ReenterSynchronizedTest test = new ReenterSynchronizedTest();
// test.print();
test.print4();
}
/**
* 同一个线程可以多次获得同一把锁
*/
public void print4(){
synchronized (this){
System.out.println("外层调用呀...");
synchronized (this){
System.out.println("中层调用呀...");
synchronized (this){
System.out.println("内层调用呀...");
}
}
}
}
}
输出:
外层调用呀... 中层调用呀... 内层调用呀...
package com.lau.javabase.lock;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 显示锁
*/
public class ReenterLockTest {
public static void main(String[] args) {
ReenterLockTest test = new ReenterLockTest();
test.print();
new Thread(() -> test.print2(),"t").start();
}
private Lock lock = new ReentrantLock();
/**
* 同一个线程可以多次获得同一把锁
*/
public void print(){
try{
lock.lock();
lock.lock();
System.out.println("外层调用");
try{
lock.lock();
System.out.println("中层调用");
try{
lock.lock();
System.out.println("内层调用");
}
finally {
lock.unlock();
}
}
finally {
lock.unlock();
}
}
finally {
lock.unlock();
// lock.unlock();
}
}
public void print2(){
try{
lock.lock();
System.out.println("come on!");
}
finally {
lock.unlock();
}
}
}
输出:
外层调用 中层调用 内层调用
看完上述内容,你们对synchronized和ReentrantLock可重入锁验证的操作方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/Howard2016/blog/5008283