synchronized同步方法
1、“线程安全”与“非线程安全”:
非线程安全情况:多个线程对同一个对象中的实例变量进行并发访问时,产生脏读。
解决方法:对实例变量的值进行同步处理。
2、方法内的变量为线程安全
3、实例变量非线程安全
解决方法:在相应类中的方法前加关键字synchronized
两个线程访问同一个对象中的同步方法,一定是线程安全的。
4、synchronized取得的锁都是对象锁
线程如何取得对象锁:
多个线程访问同一个对象,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,其他线程等待状态。
5、A线程先持有对象的Lock锁,
1)B线程调用同一个对象中非synchronized类型方法:以异步方式调用;
2)B线程调用同一个对象中任意一个synchronized类型方法:需等待A线程释放对象锁后调用,也就是同步。
6、synchronized关键字声明的方法一定是排队运行的。
注意:只有共享资源的读写访问才需要同步化。
7、synchronized关键字具有锁重入功能
就是在使用synchronized关键字情况下,一个线程得到对象锁后,再次请求该对象锁时可以再次得到该对象的锁。
“可重入锁”:自己可以再次获取自己的内部锁。
当存在父子类继承关系时,子类完全可以通过“可重入锁”调用父类的同步方法。
8、同步不可以继承
来源:《Java多线程编程核心技术》