線程安全問題解決day06

線程的生命週期:
新建---就緒--阻塞--運行--死亡
新建--就緒(調用start方法)
運行---阻塞(sleep,join,wait)
死亡(執行run方法結束,拋出異常)
阻塞---就緒 sleep時間到,notify,notifyAll


1.線程存在安全問題的原因?
由於一個線程在操作共享數據時未執行完的情況下,另外的線程參與進來,導致共享數據存在安全問題。
2.如何解決線程安全問題
必須讓一個線程操作共享數據完畢以後,其它線程纔有機會纔有機會參與共享數據的操作
3.java如何實現線程的安全:線程的同步機制
1.同步代碼塊2.同步方法

synchronized(對象(同步監視器)){
//需要被同步的代碼塊,操作共享數據的代碼
1.共享數據:多個線程共同操作的數據(變量)
2.同步監視器:由任何類的對象來充當,哪個線程獲取此監視器,誰就執行大括號裏的代碼,俗稱鎖。
}

只有實現的方式同步監視器纔可以使this,因爲實現方式多個線程同時執行一個任務,只創建了一個對象
如果是繼承的方式對象不可以是this,該對象只可以是靜態的類對像 static Object obj=new Object();因爲鎖對象必須是唯一的,繼承方式創建了多個對象,如果不加
static每個對象都有一個obj,鎖就會不唯一,線程依然會有安全問題。
public class ThreadRun implements Runnable {
 
    int ticket=100;
    public static void main(String[] args) {
        ThreadRun tr=new ThreadRun();
        Thread th=new Thread(tr);
        Thread th1=new Thread(tr);
        th.setName("窗口1");
        th.start();
        th1.setName("窗口2");
        th1.start();
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
         synchronized(this){//可以是this 或者創建任意類的對象,Object obj=new Object();synchronized(obj){}
            if(ticket>0){
             System.out.println(Thread.currentThread().getName()+"ticket="+ticket--);
            }else{
                break;
            }
        }
     }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章