解決線程安全問題的方法

clipboard.png
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

相關文章
相關標籤/搜索