java靜態方法之線程安全問題


  • 靜態方法和實例方法的區別是靜態方法只能引用靜態變量,靜態方法通過類名來調用,實例方法通過對象實例來調用
  • 每個線程都有自己的線程棧,棧與線程同時創建,每一個虛擬機線程都有自己的程序計數器PC,在任何時刻,一個虛擬機線程只會執行一個方法的代碼,這個方法稱為該線程的當前方法,如果這個方法不是native的,程序計數器就保存虛擬機正在執行的字節碼指令的地址。
  • 線程調用方法的時候會創建棧幀,用於保存局部變量表和操作數棧以及指向該類常量池的引用
  • 靜態方法雖然是同一個方法,但是不同線程在調用,程序計數器的值是不一樣的,操作這兩個線程不會相互影響(假設不存在訪問共享變量的情況)

 

在設計工具類時,這要沒有共享的變量,靜態工具類方法不需要加鎖。

在使用單例模式做工具類,這個時候靜態方法就需要加鎖,因為所有的線程雖然都是有自己的方法棧,但是在方法棧中操作的是同一個對象的實體(所以需要加鎖,加鎖的代價是所有的線程需要等待鎖的釋放才能使用該對象的引用)

在使用多例模式做工具類時,這個時候也是不需要加鎖,因為所有的線程都有自己的方法棧,但是方法棧幀中創建了獨立的對象引用,每個線程都是在操作各自方法棧幀中的局部對象引用,所以這時候不要同步





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM