【 Thread】線程並發解決synchronized
阿新 • • 發佈:2018-03-28
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