本帖最后由 HM许涛 于 2013-4-9 23:37 编辑
原题见张孝祥老师Java就业培训教程P195页5.2.4程序清单:ThreadDemo6.java
public class ThreadDemo6
{
public static void main(String[] args)
{
ThreadTest t=new ThreadTest();
new Thread(t).start();
try
{
Thread.sleep(1);
}
catch (Exception e)
{
}/**/
t.str=new String("method");
new Thread(t).start();
}
}
class ThreadTest implements Runnable
{
private int tickets=100;
String str=new String(" ");
public void run()
{
if(str.equals("method"))
{
while(true)
{
sale();
}
}
else
{
synchronized(str)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+"is saling aqaa ticket "+tickets--);
}
}
}
}
public synchronized void sale()
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+"is saling ticket "+tickets--);
}
}
}
这个例子调试了好多次,也百度了synchronized的语法,但是总是出不了书上写的效果,总是两个线程都调用sale方法,哪位大神帮忙看一下是哪里有问题?
书上给的效果应该是两个线程分别调用同步函数和同步代码块,并且最后一个线程打印结果为0.即两个没有同步。最后需要将STR替换成THIS才能实现同步。 |