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多线程核心编程技术,一本不错的书,适合新手学习。