验证同步代码块与同步函数的锁【多线程】


通过一个卖票问题,验证多线程中同步代码块与同步函数的锁。


卖票系统,两台机器t1线程和t2线程,共同卖掉100张票。


package day13;
public class SynFunctionLockDemo {
	public static void main (String[] args){
		Ticket t =new Ticket();//一个对象,共享100张票
		System.out.println("t   :"+t);
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		try{Thread.sleep(10);}catch(InterruptedException e){}
		
		t.flag = false;
		t2.start();
		/*解释第九行 这一步,
		*在主进程main中,t1.start和t2.start以及t.flag=false同时运行到了
		*主线程进行了flag->false的过程
		*t1和t2线程都只能在flag=false的同步函数中进行
		*/
	}
}
class Ticket implements Runnable{
	private int num = 100;
	boolean flag =true;
	Object obj = new Object();
	public void run(){
		System.out.println("this:"+this);
		if(flag){//同步代码块
			for(int i=200;i>1;i--){
				synchronized(obj){
					if(num>0){
						try{Thread.sleep(10);}catch(InterruptedException e){}
						System.out.println(Thread.currentThread().getName()+"...obj..."+num--);
					}
				}
			}
		}
		else{
			for(int i=200;i>1;i--)
				show();
			}
	}
	public synchronized void show(){//同步函数
		if(num>0){
			try{Thread.sleep(10);}catch(InterruptedException e){}
			System.out.println(Thread.currentThread().getName()+"...function.."+num--);
		}
	}
}



运行之后,结果会出现第0号票的可能,出现错误,说明同步函数和同步代码块的锁是不相同的。


如果将28行的synchronized(obj)改成synchronized(this)  



结果不会出现第0号票,正确,这种改法保证了同步代码块和同步函数锁的一致性,同时也验证同步代码块与同步函数的锁是不一样的。

 

同步函数的使用的锁是this

同步函数和同步代码块的区别:

同步函数的锁是固定的this

同步代码块的锁是任意的对象。

建议使用同步代码块。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值