- 靜態方法和實例方法的區別是靜態方法只能引用靜態變量,靜態方法通過類名來調用,實例方法通過對象實例來調用
- 每個線程都有自己的線程棧,棧與線程同時創建,每一個虛擬機線程都有自己的程序計數器PC,在任何時刻,一個虛擬機線程只會執行一個方法的代碼,這個方法稱為該線程的當前方法,如果這個方法不是native的,程序計數器就保存虛擬機正在執行的字節碼指令的地址。
- 線程調用方法的時候會創建棧幀,用於保存局部變量表和操作數棧以及指向該類常量池的引用
- 靜態方法雖然是同一個方法,但是不同線程在調用,程序計數器的值是不一樣的,操作這兩個線程不會相互影響(假設不存在訪問共享變量的情況)
在設計工具類時,這要沒有共享的變量,靜態工具類方法不需要加鎖。
在使用單例模式做工具類,這個時候靜態方法就需要加鎖,因為所有的線程雖然都是有自己的方法棧,但是在方法棧中操作的是同一個對象的實體(所以需要加鎖,加鎖的代價是所有的線程需要等待鎖的釋放才能使用該對象的引用)
在使用多例模式做工具類時,這個時候也是不需要加鎖,因為所有的線程都有自己的方法棧,但是方法棧幀中創建了獨立的對象引用,每個線程都是在操作各自方法棧幀中的局部對象引用,所以這時候不要同步