关于java中的synchronized关键字的理解

本文详细解析了Java中的synchronized关键字作用范围及其对多线程程序的影响,包括如何正确使用该关键字来确保共享资源的安全访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搞清楚 synchronized 锁定的是哪个对象,就能帮助我们设计更安全的多线程程序

●首先是synchronized关键字的作用域可以有两种:

・某个对象实例内

synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线 程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)

・某个类的范围

synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法

●synchronized关键字是不能继承的

●要注意的事项

・无论 synchronized 关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问

每个对象只有一个锁( lock )与之相关联

实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制

对共享资源的同步访问更加安全的技巧

定义 private instance 变量 + 它的 get 方法,而不要定义 public/protected instance 变量。如果将变量定义为 public ,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。

如果 instance 变量是一个对象,如数组或 ArrayList 什么的,那上述方法仍然不安全,因为当外界对象通过 get 方法拿到这个 instance 对象的引用后,又将其指向另一个对象,那么这个 private 变量也就变了,岂不是很危险。 这个时候就需要将 get 方法也加上 synchronized 同步,并且,只返回这个 private 对象的 clone() ――这样,调用端得到的就是对象副本的引用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值