线程锁 -卖票机制

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)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/PYouLing123456789/article/details/84340032