错误: 不管启动几个线程只有一个线程执行。 因为该线程进去之后不会跳出循环,其他线程永远都没有执行权。
修改:在同步函数定义的时候 需要哪部分同步就在同步函数中写哪部分,也就是哪部分会出现安全问题就把哪部分写在同步函数里面。如,本例中只有在if语句和if下面一条语句之间可能会出现线程跳转 而引起的安全问题 所以只需要将这部分写在同步函数里面,而while不会引起安全问题,所以将while写在run方法里面,不要写在同步函数里面。这个错误就会解决掉。
错误代码:
class SynfuncDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}
class Ticket implements Runnable
{
private int num = 100;
public void run()
{
show();
}
private synchronized void show()
{
while (1==1)
{
if (num>0)
System.out.println(Thread.currentThread().getName()+"....sale...."+num--);
}
}
}
修改后:
class Ticket implements Runnable
{
private int num = 100;
public void run()
{
while(1==1) // 此处为修改后!!
show();
}
private synchronized void show()
{
if (num>0)
<span style="white-space:pre"> </span> System.out.println(Thread.currentThread().getName()+"....sale...."+num--);
}
}