synchronized的性质
一、可重入性
官方解释:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获得该锁;
通俗解释:获得一次锁之后,如果调用其它同步方法,不需要重新获取锁,可以直接使用;
代码示例:
public class SynchTest2 implements Runnable{
static SynchTest2 synchTest=new SynchTest2();
public void run() {
method1();
}
// 静态同步方法1
public synchronized void method1() {
System.out.println("开始执行同步方法1");
method2();
}
// 静态同步方法2
public synchronized void method2() {
System.out.println("开始执行同步方法2");
}
public static void main(String[] args) {
Thread t1=new Thread(synchTest);
t1.start();
while (t1.isAlive()) {
}
System.out.println("finished");
}
}
执行结果:
解释一下代码:在方法1中调用方法2,两个方法都是同步方法,在获取方法1的锁之后,是可以直接调用方法2,而不需要重新获取锁,这就是可重入性,可重入性是线程范围,可以递归进入自己的方法,也可以调用同类的其它方法,还可以调用其它类的方法;内部实现原理是一个锁的计数器,使用一次增加1,释放一次减少1,直至为0,即释放锁;
二、不可中断性
通俗解释:一旦这个锁被别人获得了,如果我想获得,只能等待或者阻塞,直到别的线程释放这个锁,如果别人永远不释 放锁,我只能永远等下去;很执着!
Lock锁:Lock锁拥有中断的能力,如果觉得等待时间太长,有两个选择:
1、有权中断现在已经获取到锁的线程的执行;
2、不想等了,直接退出;
三、可见性
即当读写两个线程同时访问同一个变量时,synchronized用于确保写线程更新变量后,会更新到主内存上,读线程再访问该 变量时可以读取到该变量最新的值。
synchronized的缺陷
synchronized的注意事项
1、锁对象不能为空;
2、作用域不宜过大;
3、避免死锁;