Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 - Fatal编程技术网

Java 如何使状态变量线程安全

Java 如何使状态变量线程安全,java,multithreading,Java,Multithreading,假设我有一个具有静态成员变量的类,该类中有两个同步方法,static和instance,这两个方法都试图修改静态成员变量的值。第一个线程对该类的对象具有锁,所以第一个线程可以访问静态同步和实例同步方法。第二个线程具有类级锁,所以它只能访问静态同步方法。在这种情况下,如何实现线程安全。向实例方法添加一个附加的synchronized块,该块在类对象上同步,或者使用附加的锁对象。以下列表显示了前者: class Foo { private static Set<String> s

假设我有一个具有静态成员变量的类,该类中有两个同步方法,static和instance,这两个方法都试图修改静态成员变量的值。第一个线程对该类的对象具有锁,所以第一个线程可以访问静态同步和实例同步方法。第二个线程具有类级锁,所以它只能访问静态同步方法。在这种情况下,如何实现线程安全。

向实例方法添加一个附加的
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所做的一切,在大多数情况下,这还不足以保证安全性。