首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中同步"this“还是私有对象?

在Java中同步"this“还是私有对象?
EN

Stack Overflow用户
提问于 2012-06-23 14:55:55
回答 4查看 1.5K关注 0票数 9

可能重复:

Avoid synchronized(this) in Java?

这两段代码有什么不同?每种方法的优缺点是什么?

1)

代码语言:javascript
复制
public class Example {
    private int value = 0;

    public int getNextValue() {
        synchronized (this) {
            return value++;
        }
    }
}

2)

代码语言:javascript
复制
public class Example {
    private final Object lock = new Object();
    private int value = 0;

    public int getNextValue() {
        synchronized (lock) {
            return value++;
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-23 17:51:04

我选择第二种方法的主要原因是我不能控制客户端如何处理我的类的实例。

如果,出于某种原因,有人决定使用我的类的实例作为锁,他们将干扰我的类中的同步逻辑:

代码语言:javascript
复制
class ClientCode {
    Example exampleInstance;

    void someMethod() {
        synchronized (exampleInstance) {
            //...
        }
    }
}

如果在我的Example类中,我使用了一个其他人看不到的锁,他们就不能干扰我的逻辑并引入一个任意的互斥锁,就像上面的场景一样。

总而言之,这只是信息隐藏原理的一个应用。

票数 8
EN

Stack Overflow用户

发布于 2012-06-23 17:36:47

如果我需要同时执行两个彼此独立的不同任务,我会倾向于第二种选择。

例如:

代码语言:javascript
复制
public class Example {
    private int value = 0;
    private int new_value = 0;
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public int getNextValue() {
        synchronized (lock1) {
            return value++;
        }
    }

    public int getNextNewValue() {
        synchronized (lock2) {              
            return new_value++;
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-23 15:12:36

我会说第二种方法更好。考虑以下情况:

代码语言:javascript
复制
public class Abc{

    private int someVariable;

    public class Xyz {
        //some method,synchronize on this
    }

        //some method, and again synchronize on this


}

在这种情况下,两种方法中的this是不同的。一个是内部类的方法。因此,最好使用公共对象进行同步。例如,synchronized (someVariable)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11167566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档