【发布时间】:2019-01-20 16:01:53
【问题描述】:
给定一个像这样的“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(例如)应该如何实现。
【问题讨论】:
-
谁说 2 是可能的?你的老师?你的朋友?或者这是一个众所周知的练习?
-
@Stefan 这是我之前在 SO 上看到的一个练习,我认为是在面试问题的背景下。