1. 程式人生 > >【 Thread】線程並發解決synchronized

【 Thread】線程並發解決synchronized

static Object synchronized

(二)ConcurrentThread

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

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

3.線程同步(就是鎖)

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

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

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

synchronized(鎖對象){

操作共享資源代碼

}

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();
	}
}


【 Thread】線程並發解決synchronized