为了账号安全,请及时绑定邮箱和手机立即绑定

具有私有不可变对象的同步块和同步方法的区别

具有私有不可变对象的同步块和同步方法的区别

素胚勾勒不出你 2021-04-08 14:15:20
private final Object lockObject = new Object();public void getCount() {    synchronized( lockObject ) {        ...    }}为什么上面的代码比下面的代码更好:public void synchronized getCount() {      ...}我搜索并找到了如下所述的解释。将其放在方法上意味着您正在使用对象本身的锁来提供线程安全。通过这种机制,恶意代码用户也可能获得对象上的锁,并将其永久持有,从而有效地阻塞了其他线程。非恶意用户可以无意中有效地执行相同的操作。但是我无法完全理解这一点。恶意用户如何永久持有锁?任何人都可以用示例代码进行解释,以证明上述情况是正确的吗?
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞


public class Example {

    public void synchronized getCount() {

            ...

    }

}

它正在当前对象上同步this。其他类能够获取当前对象的引用并将其用作监视器锁定:


public class OtherClass {


    public void otherMethod() {

        Example example = new Example();

        synchronized (example) {

            ...

        }

    }

}

例如,这可能会得到意外的结果,导致getCount在otherMethod执行时被阻塞。


在第一种方法中,由于监视器锁lockObject是私有的,因此其他类无法直接访问它,因此它比第二种方法更可取。


查看完整回答
反对 回复 2021-04-21
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

简而言之-

在方法级别使用锁定时,您将获得已同步方法的完整类的对象的锁定。

假设是否有任何用户附带一些闪亮的代码来执行方法,直到Universe结束..这将导致其他线程因使用类中的其他方法而被阻塞。

这是监视对象和同步块是首选方式的原因。


查看完整回答
反对 回复 2021-04-21
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信