Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Synchronization - Fatal编程技术网

Java 单语句同步?

Java 单语句同步?,java,multithreading,synchronization,Java,Multithreading,Synchronization,如果我有一个getter方法,它只有一个这样的语句 public class NumberClass{ int number; public int getNumber() { return number; } ... } 多个线程访问这个方法,我必须同步这个方法吗,还是因为它只有一条语句而不需要同步 我必须同步这个[get]方法,否则就没有必要了,因为它只有一条语句 它与一个或多个语句无关。这取决于该值是否已在另一个线程中更新,以及是否希望所

如果我有一个getter方法,它只有一个这样的语句

public class NumberClass{
    int number;

    public int getNumber() {
        return number;
    }
    ...
}
多个线程访问这个方法,我必须同步这个方法吗,还是因为它只有一条语句而不需要同步

我必须同步这个[get]方法,否则就没有必要了,因为它只有一条语句

它与一个或多个语句无关。这取决于该值是否已在另一个线程中更新,以及是否希望所有线程都看到一致的值

如果在thread1中更新了
number
字段,则thread2可能会获得原始值或新值,具体取决于更新的同步方式。要正确发布值,set和get方法都需要同步

如果您只是尝试共享一个
int
值,那么将
number
字段标记为
volatile
将起作用,或者使用
AtomicInteger
在多个线程之间可靠地共享该值可能更合适

private volatile int number;
或使用:

private AtomicInteger number = new AtomicInteger();

,同步该语句可能是个好主意。原因是,根据规范,每个线程都可以缓存自己版本的变量。要演示它,请查看

其他选择包括:

  • 使变量可变:

    volatile int number;
    
  • 或从java.util.concurrent包中使用:

    AtomicInteger number;
    


作为一个旁注:如果代码>编号<代码>是“<代码>长 >类型,即使是变量的读取也不会是原子的(一个线程可以重写在读取的中间变量的值)。请参阅Java语言规范的一部分。

您需要一个内存屏障,否则其他线程不能保证看到“正确”的值(即显式分配给
number
的任何值)

要解决此问题,请将
number
声明为
final
volatile
成员,或从
synchronized
块访问它


与其他一些答案相反,陈述的数量是一个考虑因素。您不需要原子性(因为它是一条单独的语句),所以使用
synchronized
可能有些过分。如果值发生变化,则使用
volatile
,如果值没有变化,则使用
final
。如果有多个语句需要显示为原子行为,
synchronized
将是唯一的选择。

我还有一个与同步相关的类似问题,我在socket对象上使用同步,我试图看看是否可以通过其他有效的方法完全消除同步?想看看你能不能帮上忙,他帮了大卫施瓦茨。评论中有他的问题的链接。