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