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--+"号票");
					}
			}
		}
	}
}
运行结果(部分):



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值