【问题标题】:Effect of synchronized(static variable) [duplicate]同步(静态变量)的影响[重复]
【发布时间】:2013-08-14 21:42:23
【问题描述】:

使用静态变量进行同步有什么影响?

public class Something {

    public static final String LOCK = "lala";

    public void doSomething(){
        synchronized(LOCK){
        ...
        }
    }
}

【问题讨论】:

标签: java concurrency


【解决方案1】:

无论Something 实例是什么,一次只有一个线程能够调用doSomething(),因为所有实例共享同一个锁。

为了完整起见,我将在这里重复@assylias 的评论:不要在公共变量上同步,也不要在字符串文字上同步,即使是私有的,由于字符串池,它们也是共享的。您不希望任何其他不相关的类在同一个锁上同步,这样做会引入死锁等副作用。

【讨论】:

    【解决方案2】:
    public static final String LOCK = "lala";
    
    public void doSomething(){
        synchronized(LOCK){
        ...
        }
    }
    

    线程在进入同步块之前获得的锁将是类级锁,而不是对象级锁。

    【讨论】:

    • 不,这一点都不相似。静态方法将无法访问任何实例字段。
    • 是的,我的意思是考虑到同步用例。删除了那部分。发送
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多