线程锁 -卖票机制

public class TicketService {
	ArrayList<String> list = new ArrayList<>()  ;
	
	//private Vector list =  new Vector (); vector中方法 remove  和size 是有锁 
	
		public TicketService(){
			list.add("01车0A号");
			list.add("01车0B号");
			list.add("01车0C号");
			list.add("01车0D号");
			list.add("01车0E号");
			list.add("01车0F号");
			
			list.add("02车0A号");
			list.add("02车0B号");
			list.add("02车0C号");
			list.add("02车0D号");
			list.add("02车0E号");
			list.add("02车0F号");
			
		}
		
		public void sale () {
			//this or all都可以  
			//public void synchronized sale () {
			synchronized(list) {
				if(list.size()>0) {
					String number = list.remove(0);
						System.out.println(number);
					}else {
						System.out.println("已经卖光了");
					}
			}
			
		}

		public boolean hasTicket() {
			return list.size()>0;
		}
}


/***
 * 卖票:两个窗口同时卖票  
 * 出现了两个窗口卖出 ,票号相同的票
 *原因:两个线程操作了同一个资源 共享数据list 这就会有线程问题 
 *Java  中提供了一种方式解决线程安全问题  
 *	同步代码块  
 *sychronized(同步监视器对象){
 *    需要同步代码 
 *}
 *同步监视器对象的要求  
 *1)同步监视器对象的类型 可以是任意的引用数据的类型 
 *2)使用共享数据的这个多线程要用了同一个监视器对象
 *同步方法:
 *sychronized() throw
 *
 *同步监视器对象放在方法上: 
 *非静态方法:this
 *静态方法:当前类class 
 *也必须保证多个线程用同一个监视器对象 this也要是同一个 
 *依据:哪些代码执行过程中,不允许其它线程插入进来 
 */
public class TestSale {
	 public static void main(String[] args) {
		Window window1 = new Window("窗口一") ;
		Window window2 = new Window("窗口二") ;
		window1.start(); 
		window2.start(); 
	}
}

class Window extends Thread {
	 static TicketService ts     = new TicketService() ;
	 //TicketService ts     = new TicketService() ;  错误 因为tickerservice 是需要一个对象 
	 public Window (String name) {
		 super(name);
	 }
//	public  synchronized void run  错误的原因是因为非静态方法是锁定的this  但是这个this 是windows1  windows2 是不同的对象 
	 public   void run () {
		while(ts.hasTicket()) {
			ts.sale(); 
		}
	}
}

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/2018112215124247.png?x-oss-process=image/watermark, type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZb3VMaW5nMTIzNDU2Nzg5,size_16,color_FFFFFF,t_70)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值