【編程知識】線程安全

背景知識:

網站有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掉

所以靜態類儘量少用(對於新手),應該說要用在合適的地方。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章