前言
语言是会随着时代的发展而发展的,而Vector与Hashtable又是如何随着Java的发展而不再使用的呢?
同步容器
在Java发展的早期就在支持多线程了,也提供了一些线程安全的容器,比如在最早jdk1.2提供的集合容器类比如Vector、Hashtable,他们的实现机制都差不多,都是在方法层面上加synchronized关键字来实现线程安全。
在早期jdk还提供了Collections.synchronizedXxx系列方法来创建同步容器,具体如下图
这几个方法的实现方式都差不多,都是把集合对象作为参数设置进一个新对象里,然后将传递进去的集合作为新建对象的属性封装起来,最后通过访问新建对象的方法(通过synchronized实现同步)去访问传递进去的集合。
这类通过锁实现同步的叫着同步容器,同步容器对于他自身来说是线程安全的,但是我们在进行一些复合操作的时候就可能并不是线程安全的了,比如"int size = vector.size(); vector.remove(size);"这类操作,在多线程情况下如果也有get最后一个元素,就很容易出现异常。
在比如"for (int i = 0; i < vector.size(); i++)"虽然vector是线程安全的,但是可以能在遍历的过程中其他线程对vector进行了操作,比如移除了最后一个,那么这个遍历就会出现异常。