• java同步容器

  在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。注意Collection和Map是一个顶层接口,而List、Set、Queue则继承了Collection接口,分别代表数组、集合和队列这三大类容器。像ArrayList、LinkedList、HashMap这些容器都是非线程安全的。因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。

  • java中的同步容器

  1)Vector、Stack、HashTable  

  Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施。

  Stack也是一个同步容器,它的方法也用synchronized进行了同步,它实际上是继承于Vector类。

  HashTable实现了Map接口,它和HashMap很相似,但是HashTable进行了同步处理,而HashMap没有。

  2)Collections类中提供的静态工厂方法创建的类:

  Collections类是一个工具提供类,注意,它和Collection不同,Collection是一个顶层的接口。在Collections类中提供了大量的方法,比如对集合或者容器进行排序、查找等操作。最重要的是,在它里面提供了几个静态工厂方法来创建同步容器类。

  • 同步容器缺陷

  从同步容器的具体实现源码可知,同步容器中的方法采用了synchronized进行了同步,那么很显然,这必然会影响到执行性能,另外,同步容器不一定是真正地完全线程安全的,还需要添加额外的同步措施。

例如:

 1 public class Test {
 2     static Vector<Integer> vector = new Vector<Integer>();
 3     public static void main(String[] args) throws InterruptedException {
 4         while(true) {
 5             for(int i=0;i<10;i++)
 6                 vector.add(i);
 7             Thread thread1 = new Thread(){
 8                 public void run() {
 9                     for(int i=0;i<vector.size();i++)
10                         vector.remove(i);
11                 };
12             };
13             Thread thread2 = new Thread(){
14                 public void run() {
15                     for(int i=0;i<vector.size();i++)
16                         vector.get(i);
17                 };
18             };
19             thread1.start();
20             thread2.start();
21             while(Thread.activeCount()>10)   {
22                  
23             }
24         }
25     }
26 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-07
  • 2022-12-23
  • 2022-02-07
  • 2022-02-18
猜你喜欢
  • 2021-05-31
  • 2022-02-07
  • 2022-12-23
  • 2021-08-17
  • 2022-12-23
  • 2021-09-06
  • 2022-12-23
相关资源
相似解决方案