Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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类中除“synchronized”之外的getter的线程安全习惯用法_Java_Concurrency - Fatal编程技术网

Java类中除“synchronized”之外的getter的线程安全习惯用法

Java类中除“synchronized”之外的getter的线程安全习惯用法,java,concurrency,Java,Concurrency,问题: 不知道线程是否安全,但大多数情况下是线程安全的 首选的成语是什么?为什么 您的类不知道ThreadSafe,但MOSTLikelyyes不是线程安全的,因为静态变量与同步点的实例变量没有区别。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。您的类不知道线程安全,但大多数Likelyyes不是线程安全的,因为从同步的角度来看,静态变量与实例变量没有什么不同。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。据我所知,不知道线程安全,但大多数线程都不是线程安全的,因为两个线

问题:

不知道线程是否安全,但大多数情况下是线程安全的

首选的成语是什么?为什么

您的类不知道ThreadSafe,但MOSTLikelyyes不是线程安全的,因为静态变量与同步点的实例变量没有区别。除此之外,结果将与其他情况不同

第二个问题也是基于观点的。

您的类不知道线程安全,但大多数Likelyyes不是线程安全的,因为从同步的角度来看,静态变量与实例变量没有什么不同。除此之外,结果将与其他情况不同

第二个问题也是基于观点的。

据我所知,不知道线程安全,但大多数线程都不是线程安全的,因为两个线程可以同时设置和到达另一个线程->问题

不管你是否放静电,都没有区别。两者都不是线程安全的

我认为没有真正的idom。在这种情况下,我会选择第一种方式。但您也可以使用第二个线程,或者可以使用锁。

据我所知,不知道线程安全,但大多数线程不是线程安全的,因为两个线程可以同时设置并到达另一个线程->问题

public class ThreadSafe {

    private int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public synchronized int getAField() {
        return aField;
    }

}

public class ThreadSafeToo {

    private volatile int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}

public class DontKnowIfThreadSafeButMostLikelyYes {

    private static int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}
不管你是否放静电,都没有区别。两者都不是线程安全的

我认为没有真正的idom。在这种情况下,我会选择第一种方式。但是你也可以使用第二个或者你可以使用锁

public class ThreadSafe {

    private int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public synchronized int getAField() {
        return aField;
    }

}

public class ThreadSafeToo {

    private volatile int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}

public class DontKnowIfThreadSafeButMostLikelyYes {

    private static int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}
不,因为在调用getter和setter的同时,getter可能返回旧值

Is DontKnowIfThreadSafeButMostLikelyYes thread-safe?
在这种情况下,第二个类是正确同步的,是线程安全的

不,因为在调用getter和setter的同时,getter可能返回旧值

Is DontKnowIfThreadSafeButMostLikelyYes thread-safe?
在这种情况下,第二个类是正确同步的,是线程安全的,ThreadSafe也不需要同步方法:volatile赋值是原子的,并提供可见性保证

不知道线程是否安全,但大多数Likelyyes不是线程安全的:您需要同步对共享变量的读取和写入

首选的习语是主观的,但在您的情况下,有效的方法是:

What would be the preferred idiom and why?
ThreadSafeToo不需要同步方法:volatile分配是原子的,并提供可见性保证

不知道线程是否安全,但大多数Likelyyes不是线程安全的:您需要同步对共享变量的读取和写入

首选的习语是主观的,但在您的情况下,有效的方法是:

What would be the preferred idiom and why?

虽然您的结论是正确的,但您并没有引导OP了解为什么它不是线程安全的。如果该字段是非静态的,那么它仍然是线程不安全的,尽管您的结论是正确的,但您没有引导OP了解为什么它不是线程安全的。如果该字段是非静态的,那么它仍然是线程,不也是对int原子的写入吗?@archer cHao可能指的是32位原子写入,其中没有两个单独的写入具有混乱的输出。您将看到一次写入或另一次写入,因此在这种情况下,对32位in的写入是原子的。assylias提到的原子性与内存可见性有关。@JohnVint:我指的就是这个。我以前没有见过在可视性上下文中使用原子这个词。@在本例中,原子是重要的,因为您不能对volatile进行复合操作,例如volatile int a=0;a++;既不是原子也不是线程-safe@archer同意,但这不是赵所问的。对int原子的写入不是也一样吗?@archer cHao可能指的是32位原子写入,其中没有两个单独的写入具有混乱的输出。您将看到一次写入或另一次写入,因此在这种情况下,对32位in的写入是原子的。assylias提到的原子性与内存可见性有关。@JohnVint:我指的就是这个。我以前没有见过在可视性上下文中使用原子这个词。@在本例中,原子是重要的,因为您不能对volatile进行复合操作,例如volatile int a=0;a++;既不是原子也不是线程-safe@archer同意,但这不是赵的要求。