對java多線程的理解,歡迎指責

實現Runnable的好處:
1.避免單繼承的侷限性
2.將線程的任務從線程的子類中分離出來,進行了單獨的封裝,按照面向對象的思想封裝成對象
Runnable r  = new Student();
Thread thread = new Thread(r);
thread.start();


synchronized表示當前線程,獨佔 對象 someObject
當前線程獨佔 了對象someObject,如果有其他線程試圖佔有對象someObject,就會等待,直到當前線程釋放對someObject的佔用。
someObject 又叫同步對象,所有的對象,都可以作爲同步對象
爲了達到同步的效果,必須使用同一個同步對象
synchronized即爲同步關鍵字
加鎖後放入同步代碼塊 當一個線程進來時加上鎖,執行完同步代碼塊後解鎖,等待下一個線程進來
synchronized(對象鎖){
需要被同步的代碼


}
同步的好處:解決多線程的安全問題
同步的弊端:相對降低了效率,因爲同步外的線程都會判斷同步鎖
同步的前提:必須有多個線程並用同一個鎖


同步函數的鎖用的是this
同步代碼塊的鎖用任意對象,建議使用同步代碼塊


單例模式面臨的多線程問題:
餓漢式:
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static synchronized Bank getintance(){
          if(bank==null){
              bank = new Bank();
          }
          return bank;
    }
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}      
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static synchronized Bank getintance(){
          if(bank==null){
              bank = new Bank();
          }
          return bank;
    }
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}      
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static Bank getintance(){
          if(bank==null){
              synchronized(Bank.class){
                if(bank==null){
                    bank = new Bank();
                }
                }
          }
          return bank;
    }
//如果餓漢式用同步代碼塊,用this作爲鎖,每個線程首先判斷bank是否爲空,如果爲空則進入鎖內執行代碼塊,此時不影響
//其他線程進行判斷,當判斷不爲空時直接返回已實例化的bank,因此提高效率又帶來安全
}      

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