【 Thread】線程併發解決synchronized

(二)ConcurrentThreadjava

1.實際中,10個窗口賣票,併發的安全性問題,不能一張票賣給兩我的安全

2.電商中,10個手機,一下賣出去了50個,被50我的搶到了併發

3.線程同步(就是鎖)ide

 火車上廁所,廁所是共享資源,上廁所的人是併發的線程,廁所只能噓噓100次this

4.針對線程併發安全性問題,須要使用同步鎖,就是共享資源同時只能1個線程去訪問spa

5.共享資源同步鎖代碼塊線程

synchronized(鎖對象){對象

     操做共享資源代碼資源

}get

6.同步代碼加在哪裏

  (1)代碼被多個線程訪問

  (2)代碼中有共享的數據

  (3)共享數據被多條語句操做


代碼:SaleTicket_synchronized

public class SaleTicket_synchronized extends Thread{
	private static int ticket=100;
	private String windowname;

	// 3.增長同步鎖對象資源
	private static Object obj=new Object();
	
	// 1.建立一個構造方法,便於給線程設置名字
	public SaleTicket_synchronized(String windowname) {
		super(windowname);
		this.windowname=windowname;
	}

	// 2.重寫run方法
	@Override
	public void run() {
		while(true) {
			// 4.使用同步代碼塊
			synchronized (obj) {
				if(ticket>0) {
//					try {
//						Thread.sleep(10);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
					System.out.println(this.getName()+" : 正在賣第 "+ticket+" 張票");
					ticket=ticket-1;
				}else {
					System.out.println(this.getName()+" : 已售罄");
					break;
				}
			}
			
		}
	}
}


代碼:Main_synchronized

public class Main_synchronized {
	/**
	 * 併發
	 * 4個窗口,賣100張票
	 * */
	public static void main(String[] args) {
		// 5.建立SaleTicket對象
		SaleTicket_synchronized st1=new SaleTicket_synchronized("窗口1");
		st1.start();
		
		SaleTicket_synchronized st2=new SaleTicket_synchronized("窗口2");
		st2.start();
		
		SaleTicket_synchronized st3=new SaleTicket_synchronized("窗口3");
		st3.start();
		
		SaleTicket_synchronized st4=new SaleTicket_synchronized("窗口4");
		st4.start();
	}
}
相關文章
相關標籤/搜索