Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“上的同步”;这";还是Java中的私有对象?_Java_Multithreading_Synchronization - Fatal编程技术网

“上的同步”;这";还是Java中的私有对象?

“上的同步”;这";还是Java中的私有对象?,java,multithreading,synchronization,Java,Multithreading,Synchronization,可能重复: 这两段代码之间的区别是什么?每种方法的优缺点是什么 (一) (二) 我认为第二种方法更好。考虑以下情况: public class Abc{ private int someVariable; public class Xyz { //some method,synchronize on this } //some method, and again synchronize on this } 在这种情况下,这两种

可能重复:

这两段代码之间的区别是什么?每种方法的优缺点是什么

(一)

(二)


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

public class Abc{

    private int someVariable;

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

        //some method, and again synchronize on this


}

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

如果我需要同时执行两个相互独立的不同任务,我更喜欢第二个选项。

e、 g:


我选择第二种方法的主要原因是我无法控制客户机对我的类实例所做的操作

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

class ClientCode {
    Example exampleInstance;

    void someMethod() {
        synchronized (exampleInstance) {
            //...
        }
    }
}
如果在我的
示例
类中,我使用了一个其他人看不到的锁,那么它们就不能干扰我的逻辑,并像上面的场景那样引入任意互斥锁


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

我认为这取决于具体情况。假设您的类是一个子类,而超类有一个具有同步的方法。假设您正在使用相同的数据集,并且希望在方法中保持完整性。那么方法1肯定是你应该使用的


否则,根据Costi所提到的,第二种方法会更有效

第二种方法几乎总是更好(AFAIK)——但为什么呢?
(仅从外部“对象”)的可见性有哪些负面影响?“坏代码”怎么会对同步目标造成干扰?您是否知道
publilc-synchronized int-getNextValue(){…}
public-int-getNextValue(){synchronized(this){…}}
完全相同?不过,您可以使用
synchronize(Abc.this)
。这也是另一种选择,但问题是关于
这个
,即当前的
对象
的引用。不过我可能错了,我还是个初学者。:-)《Java并发实践》一书中有这样一个bug,我同意你的观点,但在这种情况下,我要说的是超类设计得不太恰当;它可以提供一个
受保护的
锁,我可以在子类中使用它,而不必公开整个同步逻辑。@CostiCiudatu完全同意您的看法。这仅适用于从其他人的代码库继承某些类的情况。这可能是罕见的。+1对于高质量的讽刺--
这可能是罕见的
:)。我想强调的是,当您能够选择时,不建议使用这种方法,但在某些情况下,这只是唯一可用的方法。
public class Abc{

    private int someVariable;

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

        //some method, and again synchronize on this


}
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++;
        }
    }
}
class ClientCode {
    Example exampleInstance;

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