背景知識:
網站有100個請求,在JavaWeb的SerVlet就是有100個線程.
現在有以下代碼
package Thread;
import org.junit.Test;
public class Thread_safe {
@Test
public void haha(){
Person p = new Person();
for(int i=0;i<9999999;i++)
{
p.list.add("123");
System.out.println(i);
}
}
}
然後Person類第一種
package Thread;
import java.util.ArrayList;
import java.util.List;
public class Person {
public List list = new ArrayList();
}
然後Person類第二種
package Thread;
import java.util.ArrayList;
import java.util.List;
public class Person {
public static List list = new ArrayList();
}
多個線程的例子有:多個請求
共享資源的例子爲:文件,數據庫,全局變量,靜態類
問:爲何靜態類是共享資源呢?答:靜態類,在程序運行前已經初始化好了。網站在服務器時,Serlvet已經產生了,那麼全部靜態類都已經初始好了,存在內存當中
在網站中的例子就爲:多個請求(訪問者),訪問一個靜態類
Person類第一種,有1000個請求都沒問題
Person類第二種,有1000個請求之後,網站的內存就會被這個類佔用,也導致線程安全問題,最終就導致內存分配不足。
如圖:
解決方案:向靜態類或容器裏面add東西之後,要remove掉
所以靜態類儘量少用(對於新手),應該說要用在合適的地方。