【发布时间】:2014-06-10 01:00:02
【问题描述】:
假设我在 Java 中有以下代码
a = 5;
synchronized(lock){
b = 5;
}
c = 5;
同步是否会阻止重新排序? a、b 和 c 之间没有依赖关系。会先分配给 a,然后再分配给 b,然后再分配给 c?如果我没有同步,语句可以以 JVM 选择的任何方式重新排序吗?
【问题讨论】:
-
发生的任何事情都完全取决于 JVM,性能不会受到影响。为什么要查明是否已完成重新排序?同步在对象级别。
-
在实际代码中,代替 (c=5),我返回一个值,另一个线程需要启动,如果第三条语句在第二条之前执行,代码将失败。我希望在几个语句之间没有重新排序,并想知道同步是否会阻止重新排序
-
如果您需要 c = 5 对正在运行的线程可见,您必须将它放在同步块中。否则不能保证其他线程会看到这个值。
-
甚至将
c=5放入synchronized是不够的。读取变量c的线程必须在synchronized块内同步在同一对象上 以确保正确读取。但即使这样也只能保证读取线程在执行包含读取的synchronized块时会读取更新的值 写入线程执行包含写入的synchronized块。synchronized只保证没有“同时”,因此执行一个显着的命令。但仅此一项还不能说明会是哪个顺序。
标签: java multithreading synchronized