|
在P448页讲解Condition条件接口中,书上给了一个例子为SyncTest.java.
定义了三个类:
Stack类:getPoint()、pop()和push()均利用外部锁进行了同步
Producter类:在run()方法中利用外部锁对Stack对象进行了同步
Consumer类:在run()方法中并没有对Stack对象进行同步,其具体实现为:
public void run(){
String goods;
for(int i = 0; i < 200; ++i){
goods = theStack.pop(); //此处pop利用外部锁实现了同步,不会有问题
System.out.println(getName()+".pop"+goods+"from"+theStack.getName()); //BUG出现在这一句
yield();
}
}
由于输出数据并不在同步代码块中,因此导致整个程序的输出结果为:
注意,这里程序的执行逻辑并没错,但是输出却出现了错误,因为在执行语句
goods = theStack.pop()将good9取出后,producter2获得了CPU的执行权,执行了push方法,放入了good9,并输出了
producter2 push 9
而后consumer1执行了输出语句:
consumer1 pop 9 (System.out.println(getName()+".pop"+goods+"from"+theStack.getName());)
以上原因造成了逻辑正确,而输出错误,因此应该把pop的输出数据放入pop中,这样不会出现这个输出错误了。
程序猿的技术大观园:www.javathinker.net
|
|