Это может быть глупый вопрос, но может ли выход этой программы (как она есть) равняться нулю?Выход программы на Java - параллельный
public class Test2{
int a = 0;
AtomicInteger b = new AtomicInteger();
public static Test2 c = new Test2();
public static void main(String[] args){
Thread t1 = new Thread(new MyTest1());
Thread t2 = new Thread (new Mytest2());
t1.start();
t2.start();
}
}
class MyTest1 implements Runnable{
public void run(){
Test2.c.a = 1;
Test2.c.b.compareAndSet(0,1);
}
}
class Mytest2 implements Runnable{
public void run(){
int x = 0;
if(Test2.c.b.get() == 1)
x = Test2.c.a;
System.out.println("Value of x = "+x);
}
}
Причина Я спрашиваю это, хотя я использую AtomicInteger, заявление, если() в MyTest2 может быть выполнена первой, а затем х будет иметь значение zero..right?
или я не думаю, что прямо.
Любая помощь будет высоко оценена.
Спасибо ... Я понимаю ... Я только что увидел фрагмент кода, и комментарии читают «output будет 1» - и, следовательно, причина, по которой я разместил его здесь. – Achilles
Вещь, которая меня беспокоит, заключается в том, что если вы сохраняете вышеуказанные утверждения в таком порядке: t1.start(); t2.start(); Тогда выход всегда 1, но если вы отмените заказ на: t2.start(); t1.start(); Тогда выход всегда равен 0. Что действительно странно, даже после 100 прогонов, я не могу заставить его производить разные выходные данные для одного и того же заказа. – Achilles
Возможно, у вас есть один основной процессор. На моей двухъядерной машине я вижу «0» примерно каждые 5 запусков. В любом случае код, размещенный как далеко, не гарантирует синхронизацию потоков каким-либо образом. Нити приводят к их собственной жизни без какой-либо помощи по синхронизации. Для другого примера кода, использующего 'CyclicBarrier', вы можете найти [этот ответ] (http://stackoverflow.com/questions/3379797/java-threaded-serial-port-read-with-java-util-concurrent-thread-access/ 3380175 # 3380175). – BalusC