这个类可以用于多线程,因为它是线程安全的.
public class Hello {
private int value = 0;
public synchronized int get() {
return value;
}
public synchronized void set(int value) {
this.value = value;
}
}我知道,除了set()之外,当get()时,我们必须使用同步的原因是内存可见性。
而java易失性关键字可以用于内存可见性。
那么..。这个类也是线程安全的??
public class Hello {
private volatile int value = 0;
public int get() {
return value;
}
public synchronized void set(int value) {
this.value = value;
}
}发布于 2016-05-19 02:24:37
在您的示例中,不需要在get()或set方法中使用value,因为value属性是用volatile关键字声明的。
这是因为volatile关键字强制在写入线程和读取器线程之间的关系发生之前。
Java编程语言允许线程访问共享变量(§17.1)。作为一项规则,为了确保一致和可靠地更新共享变量,线程应该通过获取一个锁来确保它独占使用这些变量,该锁通常对这些共享变量强制互斥。 Java编程语言提供了第二种机制,即易失性字段,这比出于某些目的进行锁定更方便。 字段可以声明为可变值,在这种情况下,Java内存模型确保所有线程都看到变量的一致值(§17.4)。
因此,在您的示例中,不需要同步get()和set()方法。
发布于 2016-07-07 09:15:54
在您的类Hello中,只有一个字段int value。同步锁定整个对象,从而进行大量操作,而可以使用AtomicInteger。因为原子*变量更快。易失性只是满足“发生前”,你不能达到原子性的操作,如“检查,然后行动”与挥发分。
要使Hello类线程安全,最好的方法是
import java.util.concurrent.atomic.AtomicInteger;
public class Hello {
private AtomicInteger value;
public int get() {
return this.value.get();
}
public synchronized void set(int value) {
this.value.set(value);
}
}正如这个职位中提到的
如果某个对象只有一个字段,或者它的关键更新仅限于对象的一个字段,则不使用同步或其他线程安全集合、原子变量(AtlomicInteger、AtomicReference等)。可以利用。
https://stackoverflow.com/questions/37312655
复制相似问题