1.JVM之對Vector執行緒安全的測試(相對執行緒安全)
阿新 • • 發佈:2018-11-23
import java.util.Vector; public class vector { private static Vector<Integer> vector=new Vector<>(); public static void main(String[] args){ while(true){ for (int i=0;i<10;i++){ vector.add(i); } Thread removedThread=new Thread(new Runnable() { @Override public void run() { for(int i=0;i<vector.size();i++){ vector.remove(i); } } }); Thread printThread=new Thread(new Runnable() { @Override public void run() { for(int i=0;i<vector.size();i++){ System.out.println((vector.get(i))); } } }); removedThread.start(); printThread.start(); while(Thread.activeCount()>30); } } }
以上程式是有執行緒安全問題的,兩個執行緒同時在跑,vector容器中一共只有10個執行緒容量。當removed執行緒剛從容器中去掉一個執行緒ID的時候,然後print執行緒又去get一個執行緒,如果執行緒剛好刪除,但是同時又在取用,那麼請問,一個資源正在移除,一個資源正在準備生成。
那麼應該如何去滿足:
用以下程式碼可以去實現:
import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable; import java.util.Vector; public class vector { private static Vector<Integer> vector=new Vector<>(); public static void main(String[] args){ while(true){ for (int i=0;i<10;i++){ vector.add(i); } Thread removedThread=new Thread(new Runnable() { @Override public void run() { /** * //使用synchronized鎖機制將操作物件進行鎖定, * 當執行這個remove操作的時候,其他vector不可以訪問當時的這個資源i */ synchronized (vector) { for (int i = 0; i < vector.size(); i++) { vector.remove(i); } } } }); Thread printThread=new Thread(new Runnable() { @Override public void run() { for(int i=0;i<vector.size();i++){ System.out.println((vector.get(i))); } } }); removedThread.start(); printThread.start(); while(Thread.activeCount()>30); } } }
以上很小的改變就將一個執行緒不安全的程序操作改變成了一個執行緒相對安全的執行緒。
java語言中Vector,Hashtable以及Collections的synchronizedCollection()包裝的集合均是:
相對執行緒安全總結:
Vector,Hashtable,Collections的synchronizedCollection()