Java类中除“synchronized”之外的getter的线程安全习惯用法
问题: 不知道线程是否安全,但大多数情况下是线程安全的 首选的成语是什么?为什么 您的类不知道ThreadSafe,但MOSTLikelyyes不是线程安全的,因为静态变量与同步点的实例变量没有区别。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。您的类不知道线程安全,但大多数Likelyyes不是线程安全的,因为从同步的角度来看,静态变量与实例变量没有什么不同。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。据我所知,不知道线程安全,但大多数线程都不是线程安全的,因为两个线程可以同时设置和到达另一个线程->问题 不管你是否放静电,都没有区别。两者都不是线程安全的 我认为没有真正的idom。在这种情况下,我会选择第一种方式。但您也可以使用第二个线程,或者可以使用锁。据我所知,不知道线程安全,但大多数线程不是线程安全的,因为两个线程可以同时设置并到达另一个线程->问题Java类中除“synchronized”之外的getter的线程安全习惯用法,java,concurrency,Java,Concurrency,问题: 不知道线程是否安全,但大多数情况下是线程安全的 首选的成语是什么?为什么 您的类不知道ThreadSafe,但MOSTLikelyyes不是线程安全的,因为静态变量与同步点的实例变量没有区别。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。您的类不知道线程安全,但大多数Likelyyes不是线程安全的,因为从同步的角度来看,静态变量与实例变量没有什么不同。除此之外,结果将与其他情况不同 第二个问题也是基于观点的。据我所知,不知道线程安全,但大多数线程都不是线程安全的,因为两个线
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同意,但这不是赵的要求。