在做一個web項目的時候需要做一個通用類去處理一些問題,想到這個類很多地方都有用到,又不想每次都new一個,因此就定義了里面的方法是靜態方法,然后又因為多個靜態方法都用到了同一個對象,結果定義了一個類的全局變量讓每個靜態方法去調用它,剛開始沒什么問題,后來項目上線沒多久就掛了,最后發現這樣做導致了多線程的並發問題,所以就想在這里記錄一下…
下面是一個例子,例如:
public class TestUtil { private static User user=new User(); public static void setName(String name){ //在靜態方法中調用了全局變量並進行了修改操作,線程不安全 user.setUsername(name); } public synchronized static void setName1(String name){ //在靜態方法中調用了全局變量並進行了修改操作,使用了同步關鍵字,線程安全 user.setUsername(name); } }
總結:只要你的靜態方法不訪問全局變量的話,就不會有並發問題
訪問全局變量肯定會出現並發問題,這是毫無疑問的
靜態方法內部的變量,都是局部變量,每次調用靜態方法時都會重新分配內存空間,所以是安全的
也就是是說只要你的靜態方法不訪問全局變量的話,就不會有並發問題