- 多線程中使用靜態方法或者靜態類會不會有線程安全問題呢?
public class Test
{
public static String hello(String str)
{
String tmp = "";
tmp = tmp + str;
return tmp;
}
}
靜態方法如果沒有使用靜態變量,則沒有線程安全問題。
爲什麼呢?因爲靜態方法內聲明的變量,每個線程調用時,都會新創建一份,而不會共用一個存儲單元。比如這裏的tmp,每個線程都會創建自己的一份,因此不會有線程安全問題。
注意:靜態變量,由於是在類加載時佔用一個存儲區,每個線程都是共用這個存儲區的,所以如果在靜態方法裏使用了靜態變量,這就會有線程安全問題!
- String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
詳解:
String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。