java--同步的前提

在解决线程安全问题中时,我们运用了同步(点击打开链接),但是在使用同步时要具备前提条件:同步中必须有多个线程并使用同一个锁(对象)。

什么是使用同一个锁呢?

我们在解决线程安全问题是,在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--+"号票");
					}
			}
		}
	}
}
运行结果(部分):

java--同步的前提_第1张图片java--同步的前提_第2张图片java--同步的前提_第3张图片


可以看到结果中又出现了0号、-1号、-2号票,这是因为每个线程都要运行自己的run()方法,都会重新创建一个局部Object类对象obj,意味着每个线程都有自己的锁,这时四个线程就没有使用同一个锁,没有实现同步,结果就出了错误。

你可能感兴趣的:(java--同步的前提)