首先,什么是锁,为什么要用这个玩意儿?
掌握Java中锁是Java多线程编程中绕不开的知识,只有知道理解Java各种锁才能在编码过程中灵活运用,写出更高效的多线程程序。而理解掌握锁的第一步,可从宏观上对比理解一下各种锁概念。
synchronized同步锁:
public class UserInfoService {
/** 普通代码 **/
public String getUserInfo(String id) {
// TODO
Sysotem.out.println("--------------普通代码(无锁)--------------");
return null;
}
// 同步锁(锁方法体)
public synchronized String getUserInfo(String id) {
// TODO
Sysotem.out.println("--------------同步锁(锁方法体)--------------");
return null;
}
// 同步锁(锁代码块)
public String getUserInfo(String id) {
synchronized (this) {
// TODO
Sysotem.out.println("--------------同步锁(锁代码块)--------------");
}
return null;
}
}
synchronized可重入锁:
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。
对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。
synchronized void setA() throws Exception{
Thread.sleep(1000);
setB();
}
synchronized void setB() throws Exception{
Thread.sleep(1000);
}
上面的代码就是一个可重入锁的一个特点,如果不是可重入锁的话,setB可能不会被当前线程执行,可能造成死锁。
注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!
持续更新中…
如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:
你遇到的问题是小编创作灵感的来源!