在解决线程安全问题中时,我们运用了同步(点击打开链接),但是在使用同步时要具备前提条件:同步中必须有多个线程并使用同一个锁(对象)。
什么是使用同一个锁呢?
我们在解决线程安全问题是,在Ticket类中这样书写的代码:
class Ticket implements Runnable{
private int num=100; //共有100张票
Object obj=new Object();
public void run()
{
while(true)
{
synchronized(obj) //同步代码块
{
if(num>0){
try{Thread.sleep(10); }
catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"卖"+num--+"号票");
}
}
}
}
}
这是四个线程都使用的是同一个锁(对象)obj。
当这样书写时:
class Ticket implements Runnable{
private int num=100;
public void run()
{
Object obj=new Object();
while(true)
{
synchronized(obj) //同步
{
if(num>0){
try{Thread.sleep(10); }
catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"卖"+num--+"号票");
}
}
}
}
}
运行结果(部分):
可以看到结果中又出现了0号、-1号、-2号票,这是因为每个线程都要运行自己的run()方法,都会重新创建一个局部Object类对象obj,意味着每个线程都有自己的锁,这时四个线程就没有使用同一个锁,没有实现同步,结果就出了错误。