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