nds*_*svw 3 java parallel-processing
鉴于"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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果一个线程在另一个线程已经完成之后运行它的循环,那么程序的输出应该是Final value: 20.
但可能出现什么问题?像10,11,... 19这样的结果也是可能的(如果OS在线程之间切换).
10到20之间的值是可能的吗?到目前为止,我理解它.
但是这个练习的正确解决方案是:任何2到20之间的输出都是可能的.我不明白2(例如)应该如何实现.
And*_*ner 10
你有两个线程,T1和T2.它们将分别进行10次读取(10R)和10次写入(10W).因为读取和写入是同步的,所以可以保证它们不会并行发生; 并且在以下任一线程的读取中都可以看到先前写入的值.
T1现在做了1R,1W; T2做了9R,9W.
(或者反过来说:这两者的排序并不重要)
T1做了2R,1W; T2做了10R,9W.
T1做了10R,10W.
T2做了10R,10W.
根据需要,最终写入的值为2.
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |