Учитывая "StrangeLoop" -код вроде этого:
2 Потоки проходят через цикл (каждый), и они получают и устанавливают значение объекта класса MyInteger:
Какие результаты / результаты возможны?
class MyInteger
{
private int value;
public synchronized int getValue()
{
return value;
}
public synchronized void setValue(int value)
{
this.value = value;
}
}
public class StrangeLoop extends Thread
{
private MyInteger data;
public StrangeLoop(MyInteger data)
{
this.data = data;
}
public void run()
{
for (int i = 1; i <= 10; i++)
{
int local = data.getValue();
local++;
data.setValue(local);
}
}
public static void main(String[] args)
{
MyInteger data = new MyInteger();
StrangeLoop t1 = new StrangeLoop(data);
StrangeLoop t2 = new StrangeLoop(data);
t1.start();
t2.start();
try
{
t1.join();
t2.join();
}
catch (InterruptedException e)
{
}
System.out.println("Final value: " + data.getValue());
}
}
Если один поток проходит через свой цикл после того, как другой поток уже сделал это, вывод программы должен быть Final value: 20
.
Но что может пойти не так?
Также возможны результаты типа 10,11, ... 19 (если ОС переключается между потоками).
Возможны значения от 10 до 20? Пока я это понимаю.
Но правильное решение этого упражнения: любое значение от 2 до 20 возможно. Я не понимаю, как 2 (например) должно быть возможно.