Java 如何使状态变量线程安全
假设我有一个具有静态成员变量的类,该类中有两个同步方法,static和instance,这两个方法都试图修改静态成员变量的值。第一个线程对该类的对象具有锁,所以第一个线程可以访问静态同步和实例同步方法。第二个线程具有类级锁,所以它只能访问静态同步方法。在这种情况下,如何实现线程安全。向实例方法添加一个附加的Java 如何使状态变量线程安全,java,multithreading,Java,Multithreading,假设我有一个具有静态成员变量的类,该类中有两个同步方法,static和instance,这两个方法都试图修改静态成员变量的值。第一个线程对该类的对象具有锁,所以第一个线程可以访问静态同步和实例同步方法。第二个线程具有类级锁,所以它只能访问静态同步方法。在这种情况下,如何实现线程安全。向实例方法添加一个附加的synchronized块,该块在类对象上同步,或者使用附加的锁对象。以下列表显示了前者: class Foo { private static Set<String> s
synchronized
块,该块在类对象上同步,或者使用附加的锁对象。以下列表显示了前者:
class Foo {
private static Set<String> state = new HashSet<>();
public static synchronized void bar(String item) {
state.add(item);
}
public /* synchronized */ baz(String item) {
synchronized (Foo.class) {
state.add(item);
}
}
}
class-Foo{
私有静态集状态=新HashSet();
公共静态同步空栏(字符串项){
状态。添加(项目);
}
public/*synchronized*/baz(字符串项){
已同步(Foo.class){
状态。添加(项目);
}
}
}
请发布一些代码:)不清楚。文章和例子。同步方法使用类对象作为锁。阅读更多@njzk2静态同步方法使用类对象作为锁,但jasminum询问如何确保可以从实例方法安全访问静态数据。@jameslarge:是的,我不完全清楚,感谢您解释Additional lock对象的含义与此类似:private static final object lock=new object()。我们可以将静态变量state设置为volatile,而不需要提及synchronized关键字吗?@jasminum:这取决于类型和操作,如果您可以使用volatile
或原子类型而不是synchronized
。在这种情况下,您必须提供更多信息。@jasminum,volatile
不能替代synchronized
。synchronized
的主要目的是防止两个或多个线程同时对同一数据进行操作。第二个目的是确保一个线程所做的更改会被其他线程及时看到。这就是volatile所做的一切,在大多数情况下,这还不足以保证安全性。