【发布时间】:2017-06-14 22:07:32
【问题描述】:
在文档中说你可以同样使用if-else 多次或switch-case:
int condition;
setCondition(int condition) {
this.condition = condition;
}
任一开关盒
switch (condition) {
case 1: print("one"); break;
case 2: print("two"); break;
或
if (condition == 1) { print("one"); }
else if (condition == 2) { print("two"); }
接下来,condition 被声明为 volatile 并从多个线程调用方法 setCondition()。
If-else 不是原子的,volatile 变量写入是同步操作。所以“one”和“two”字符串都可以打印在最后一个代码中。
如果使用了一些具有初始值的方法局部变量,则可以避免:
int localCondition = condition;
if (local condition == ..) ..
switch-case 操作员是否持有一些变量的初始副本?它是如何实现跨线程操作的?
【问题讨论】:
-
您的假设是错误的:If/else 保证即使在竞争条件下也只采用一个分支。这只有在竞争条件导致未定义行为的 c 等语言中才有可能。
-
@Boris
if/else if与if/if的全部意义在于事实并非如此。 -
@Voo 我明白你的意思 - 我很厚。把它归咎于周日的宿醉。我想如果值在评估期间发生变化,它可能会打印 nothing - 这是
switch会阻止的竞争条件。 -
在 which 文档中说明了多个 if-else 与 switch-case?也许它是一份非正式的文档,涵盖了语言基础知识,但不包括多线程的微妙之处
-
为保护@Voo 的宿醉,他断言“
if/else保证即使在竞争条件下[确切] 一个分支也会被采用”,这绝不是不真实的。后续地址if/else if与if/if,虽然可能是切线相关的,但不会改变声明的声明。
标签: java multithreading if-statement switch-statement conditional-statements