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()