Java 单语句同步?
如果我有一个getter方法,它只有一个这样的语句Java 单语句同步?,java,multithreading,synchronization,Java,Multithreading,Synchronization,如果我有一个getter方法,它只有一个这样的语句 public class NumberClass{ int number; public int getNumber() { return number; } ... } 多个线程访问这个方法,我必须同步这个方法吗,还是因为它只有一条语句而不需要同步 我必须同步这个[get]方法,否则就没有必要了,因为它只有一条语句 它与一个或多个语句无关。这取决于该值是否已在另一个线程中更新,以及是否希望所
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对象上使用同步,我试图看看是否可以通过其他有效的方法完全消除同步?想看看你能不能帮上忙,他帮了大卫施瓦茨。评论中有他的问题的链接。