package com.itheima.demo07.Synchronized;
/*安全
賣票案例出現了線程安全問題 賣出了不存在的票和重複的票 解決線程安全問題的一種方案:使用同步代碼塊 格式: synchronized(鎖對象){ 可能會出現線程安全問題的代碼(訪問了共享數據的代碼) } 注意: 1.經過代碼塊中的鎖對象,可使用任意的對象 2.可是必須保證多個線程使用的鎖對象是同一個 3.鎖對象做用: 把同步代碼塊鎖住,只讓一個線程在同步代碼塊中執行
*/
public class RunnableImpl implements Runnable{多線程
//定義一個多個線程共享的票源 private int ticket = 100; //建立一個鎖對象 Object obj = new Object(); //設置線程任務:賣票 @Override public void run() { //使用死循環,讓賣票操做重複執行 while(true){ //同步代碼塊 synchronized (obj){ //先判斷票是否存在 if(ticket>0){ //提升安全問題出現的機率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } } } }
}
package com.itheima.demo07.Synchronized;ide
/*spa
模擬賣票案例 建立3個線程,同時開啓,對共享的票進行出售
*/
public class Demo01Ticket {線程
public static void main(String[] args) { //建立Runnable接口的實現類對象 RunnableImpl run = new RunnableImpl(); //建立Thread類對象,構造方法中傳遞Runnable接口的實現類對象 Thread t0 = new Thread(run); Thread t1 = new Thread(run); Thread t2 = new Thread(run); //調用start方法開啓多線程 t0.start(); t1.start(); t2.start(); }
}code