(转)synchronized(对象锁)和static synchronized(类锁)的区别

本文详细解析了Java中的实例锁与全局锁的区别,探讨了synchronized关键字如何实现对象级锁和类级锁,以及static synchronized在多线程环境中的作用。

一个是实例锁锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),
一个是全局锁该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。

ps:对象锁与类锁互不干扰,与对象无关!

实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。

注: 
static 说明了该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁!
(实践才能更好的理解)
实例锁是锁特定的实例(只要有synchronized就会去锁该实例),全局锁是锁所有的实例。

 synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块(注:是所有),注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。
static synchronized恰好就是要控制类的所有实例的并发访问,static synchronized是限制多线程中该类的所有实例同时访问jvm中该类所对应的代码块。

也就是说synchronized相当于 this.synchronized,而static synchronized相当于Something.synchronized. 

 

注意:synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;  

 

摘取自:https://www.cnblogs.com/lixuwu/p/5676143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值