synchronized同步方法的核心特性

  • Post author:
  • Post category:其他



1.多个对象多个锁

synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁.

及每创建一个对象都会创建一个自身对象得锁。


2.异步性

两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,效果却是以异步的方式运行的。

刚开始看到晕了好一阵,上面已经说了synchronized是对象锁,所以不同对象,分别线程访问,都不是一个锁肯定不会相互影响,各自执行,资源分配不同就会出现这种现象?


3.synchronized方法与锁对象

(1) A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。

(2)A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需等待,也就是同步。(不一定是相同方法,只要是synchronized的方法就会等待)


4.脏读

基于第三条的规则,当在A线程调用了同步方法(synchronized修饰的),调用一个set方法,B线程如果调用想同属性的get方法(非同步方法)就可能会出现脏,解决方法当然是在get方法上也加入同步。


5.synchronized锁重入

在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的(自己可以再次获取自己的内部锁)。

可重入锁也支持在父子类继承的环境中,A类继承B类,A和B类中的同步方法,B类中同步方法调用继承父类同步方法,可以直接获取到锁。

在思考下:

比如有1条线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。


6.出现异常,锁自动释放

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。


7.同步不有继承性

同步不可以继承,及重写继承的方法没有加同步关键字,他就是一个普通方法,不是同步的。


文中大部分内容来自(微信读书) 高洪岩-java多线程核心编程技术,一本不错的书,适合新手学习。



版权声明:本文为qq_16050561原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。