总结一 :认识同步监视器(锁)
synchronize(同步监视器){
1.必须是引用数据类型,不能是基本数据类型;
2.在同步代码块中可以改变同步监视器对象的值,但不能改变引用类型;
3.尽量不要使用String和包装类Integer做同步监视器,如果使用了,只要保证代码块中不对其进行任何操作也没有关系;
4.一般只要给共享资源使用同步监视器即可;
5.建议使用final修饰同步监视器;
}
总结二 :同步代码块的执行过程
1.第一个线程来到同步代码块,发现同步监视器OPEN状态,需要先CLOSE,然后执行逻辑代码;
2.第一个线程执行过程中,发现了线程切换(阻塞、就绪),第一个线程失去cpu,但是锁依旧把持没有open;
3.第二个线程获取了CPU,来到了同步代码块,发现同步监护器CLOSE,无法打开,所以不能执行逻辑代码,第二个线程也进入阻塞状态;
4.第一个线程再次获取CPU,执行后续逻辑代码并完成,释放锁close;
5.第二个线程获取到cpu,来到同步代码块,先加锁,执行逻辑代码(重复该流程)。
注意:同步代码块中可以切换线程,但是由于锁处于close状态,所以新线程并不能执行,只能处于阻塞状态!
总结三:
线程同步优点:安全
缺点:效率低,容易死锁