synchronized(object)的應用場景以及與synchronized修飾方法的區別

使用synchronized(object) { 代碼塊.... } 能對代碼塊進行加鎖,不允許其他線程訪問,其的作用原理是:在object內有一個變量,當有線程進入時,判斷是否爲0,如果爲0,表示可進入執行該段代碼,同時將該變量設置爲1,這時其他線程就不能進入;當執行完這段代碼時,再將變量設置爲0。

想保證代碼塊在任務情況下都同步,即代碼塊在程序的中同一時刻只被一個線程調用,即需要使用synchronized( static object)。

代碼例子:

    public class TestThread {  
         private static Object lock=new Object(); //必須是靜態的。  
         public  void execute(){  
             synchronized(lock){  
                 for(int i=0;i<100;i++){  
                     System.out.println(i);  
                 }      
             }  
         }  
    }  

object必須是靜態變量,否則不同對象調用該方法時也不能同步。

這種技術可以應用在實現JAVA層的悲觀鎖,例如在DAO類中希望用悲觀鎖控制某個方法同步(整個app中每次只允許一個線程同時調用)。

至於在JAVA中實現樂觀鎖,就可以使用volitile變量,在方法開始時將變量先+1,獲取值,然後在方法完成時判斷該值是否爲方法開始時+1的值,如果不是,則表示有其他線程修改過。

與使用synchronized修飾方法的區別

使用synchronized修飾方法,當一個線程進入這個方法後,這個方法的大門就會暫時關閉(不許其他線程進入)直到這個線程走出這個方法後,該方法的大門纔會敞開。當然,這個關閉只是對於該類的當前實例有效,多個實例的對象仍然可以同時執行。

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