新手-线程-同步

同步代码块与同步函数交替执行
排除安全隐患。

package hr.csdn.com;
/*
 
 1 让同步函数 和同步代码块交替执行
 2 只有同步函数和同步代码块使用相同的锁 才能实现同步。
 3 验证同步函数使用的是this锁
 
 */
public class Syno {
		public static  void main(String args[]){
			Test a=new Test();
			Thread t1=new Thread(a);
			Thread t2=new Thread(a);
			t1.start();//开启一个线程以后,让main线程休息10毫秒
			try{
					Thread.sleep(10);
			}
				
			catch(Exception e){
				e.printStackTrace();
			}
			a.str="abc";//设置字符串为abc ,让它执行同步函数以达到交替执行的目地
			t2.start();
}
}
class Test implements Runnable{
	private  int  tickets=100;
	 String str=new String("");//任何一个对象都可以成为一个锁  比如Object obj=new Object();
	 							//在这里我用String对象作为标记
	public synchronized void action(){//这个同步函数的锁是this 也就是本类的对象,这是为了 与同步代码块实现同步,排除安全隐患
		while(true){
		if(tickets>0){
			try{
				Thread.sleep(20);
				
			}catch(Exception e){
				
				e.printStackTrace();
				
			}
		System.out.println(Thread.currentThread().getName()+"同步函数卖票"+tickets--);
		}
		}
	}
	public void run(){
		while(true){
			if(str.equals("abc")){
				action();
			}else{
				while(true){
					show();
				}
			}
		}
	}
	private void show() {
		// TODO Auto-generated method stub
		while(true){
			synchronized(this){//若是这里的用String对象作为锁,就会出现安全隐患
				
				if(tickets>0){
					try{
						Thread.sleep(20);
						
					}catch(Exception e){
						
						e.printStackTrace();
						
					}
				System.out.println(Thread.currentThread().getName()+"同步代码块卖票"+tickets--);
				}
				
			}
		
		}
		
	}
	
}
																																


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值