У меня есть простая Java-программа с 3 потоками, каждая из которых увеличивается, а затем печатает переменную counter
. Код Java это- Неожиданный результат Java Multi-Threading
public class test implements Runnable {
private int counter=0;
public static void main(String args[]){
test t=new test();
Thread t1=new Thread(t,"THREAD 1");
Thread t2=new Thread(t,"THREAD 2");
Thread t3=new Thread(t,"THREAD 3");
t1.start();
t2.start();
t3.start();
}
public void run(){
counter=counter+1;
System.out.println(Thread.currentThread().getName()+" "+ counter);
}
}
Понимание того, что метод run
не синхронизирован нити могут перемежать любым способом дает никакого результата, но результат я получаю в основном (я запустить программу несколько раз)
THREAD 1 2
THREAD 3 3
THREAD 2 2
Я не понимаю, почему 1
никогда не печатается и даже после печати 3
, 2
снова печатается (с момента последнего значения counter
было установлено до 3
, как печатается).
Кроме того, является переменная counter
разделяемая среди 3-х потоков? Он будет передан, если я сделаю это static
, но что в этом случае.
Пожалуйста, объясните.
Вы передаете один и тот же экземпляр 't' в свои 3 потока, поэтому все они используют один и тот же экземпляр' counter'. Кроме того, поле 'counter' модифицируется несколькими потоками и не имеет синхронизации, поэтому ваши вычисления, вероятно, являются только cpu-памятью и не сохраняются в реальной памяти, что может привести к фанк-результатам –
@RobinJonsson, поэтому в общем случае переменные класса будут если я передаю один и тот же экземпляр объекта при создании потоков, или если я использую static, иначе они получат отдельный стек стека? –