一:先看程式
public class timer1 catch (interruptedexception e)
system.out.println(name + ",你是第" + num + "個使用timer的執行緒"); }}
public class testsync1 implements runnable
public static void main(string args)
}
看輸出結果:
thread-0,你是第2個使用timer的執行緒
thread-1,你是第2個使用timer的執行緒
結果明顯有問題:
這是因為兩個執行緒訪問的是同乙個timer物件,其中乙個執行緒呼叫timer的add方法時,num++,這個時候,另外乙個執行緒也有可能呼叫add方法,num又++,然後執行緒1輸出,執行緒2輸出,輸出的是同乙個num = 2
二:解決辦法
add方法上加上synchronized關鍵字:public synchronized void add(string name) catch (interruptedexception e)
system.out.println(name + ",你是第" + num + "個使用timer的執行緒");
}這兩種方法,道理是乙個的,都是實現鎖定timer物件。
java中線程同步基礎
臨界區 臨界區是乙個用以訪問訪問共享資源的 塊,這個 塊在同一時間內只允許乙個執行緒執行。重入鎖 當末個執行緒請求乙個由其他執行緒持有的鎖時,發出的請求的執行緒就會阻塞,然而內建鎖 synchronized 是可重入的,因此如果末個執行緒試圖獲得乙個已經由他自己持有的鎖,那麼這個請求就會成功。syn...
java 執行緒 執行緒同步
threadlocal與其它同步機制的比較 threadlocal和其他所有的同步機制都是為了解決多執行緒中的對同一變數的訪問衝突。在普通的同步機制中,是通過對物件加鎖來實現多個執行緒對同一變數的安全訪問的。這時該變數是多個執行緒共享的,使用這種同步機制需要很細緻的分析在什麼時候對變數進行讀寫,什麼...
java同步執行緒
同步執行緒 synchronized方法 乙個類中任何方法都可以定義為synchronized方法以防止多執行緒資料崩潰。當某個物件用synchronized方法修飾時,表明該物件在任一時刻只能由乙個執行緒訪問。宣告方法體的一般格式 modifier synchronized returntype ...