版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nangeali/article/details/82344527
同步类容器
是线程安全的
但是,在某些场景下
可能需要加锁来保护复合操作
复合类操作,比如
迭代,反复访问元素、遍历完容器中所有元素
跳转,根据指定的顺序,找到当前元素的下一个元素
以及条件运算等
这些复合操作在多线程,并发的修改容器时
可能会表现出意外的行为,经典的是ConcurrentModificationException
因为,当容器迭代的过程中,被并发的修改了内容
这是,由于早期迭代器设计的时候,并没有考虑并发修改的问题
同步类容器,比如
Vector、HashTable
这些容器的同步功能,其实
都是有JDK的Collections.Synchronized等,工厂方法去创建实现的
底层的机制,无非就是用传统的synchronized关键字
对每个公用的方法都进行同步,使得每次只能有一个线程访问容器的状态
这明显不是互联网高并发的需求
在保证线程安全的同时,必须有有足够好的性能
package com.bjsxt.base.coll012;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
/**
* 多线程使用Vector或者HashTable的示例(简单线程同步问题)
*/
public class Tickets {
public static void main(String[] args) {
//初始化火车票池并添加火车票:避免线程同步可采用Vector替代ArrayList HashTable替代HashMap
final Vector<String> tickets = new Vector<String>();
for(int i = 1; i<= 1000; i++){
tickets.add("火车票"+i);
}
for(int i = 1; i <=10; i ++){
new Thread("线程"+i){
public void run(){
while(true){
if(tickets.isEmpty()) break;
System.out.println(Thread.currentThread().getName() + "---" + tickets.remove(0));
}
}
}.start();
}
}
}
运行