JavaScriptではそれが可能であることは分かっている。
しかし、Java で以下の条件で「成功」メッセージを印刷することは可能ですか?
if (a==1 && a==2 && a==3) {
System.out.println("Success");
}
誰かが提案しました:
int _a = 1;
int a = 2;
int a_ = 3;
if (_a == 1 && a == 2 && a_ == 3) {
System.out.println("Success");
}
しかし、これを行うと実際の変数が変更されます。他の方法はありますか?
ベストアンサー1
a
はい、変数をvolatile として宣言すれば、複数のスレッドでこれを実現するのは非常に簡単です。
1 つのスレッドは変数 a を 1 から 3 に絶えず変更し、別のスレッドはそれを絶えずテストしますa == 1 && a == 2 && a == 3
。コンソールに「成功」という連続したストリームが表示されるほど頻繁に発生します。
(句を追加するとelse {System.out.println("Failure");}
、テストが成功するよりも失敗する頻度がはるかに高くなることに注意してください。)
実際には、 をa
volatile として宣言しなくても動作しますが、私の MacBook では 21 回しか動作しませんでした。 がない場合volatile
、コンパイラまたは HotSpot はステートメントを にキャッシュa
または置き換えることができます。 おそらく、しばらくすると HotSpot が作動し、 の値をキャッシュするアセンブリ命令にコンパイルします。if
if (false)
a
と volatile
、永遠に「成功」と出力され続けます。
public class VolatileRace {
private volatile int a;
public void start() {
new Thread(this::test).start();
new Thread(this::change).start();
}
public void test() {
while (true) {
if (a == 1 && a == 2 && a == 3) {
System.out.println("Success");
}
}
}
public void change() {
while (true) {
for (int i = 1; i < 4; i++) {
a = i;
}
}
}
public static void main(String[] args) {
new VolatileRace().start();
}
}