Java并发编程实战-第5章 基础构建模块- 高飞网

第5章 基础构建模块

——同步容器类

2016-04-02 21:48:00.0

    同步容器类包括Vector和Hashtable,此外还有通过Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个仅有方法都进行同步,使得每次只有一个线程能访问容器的状态。(因此这种类的性能很低

同步类容器的问题

    同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作。这类复合操作包括迭代、跳转以及有条件运算。如:

import java.util.*; 
public class SynCollection{ 
    public static Object getLast(Vector list){ 
        int lastIndex = list.size() - 1 ; 
        return list.get(lastIndex); 
    }   
 
    public static void deleteLast(Vector list){ 
        int lastIndex = list.size() - 1 ; 
        list.remove(lastIndex); 
    }   
}

    这样在计算lastIndex完成之后,其他线程如果删除了最后一个元素,则后面的操作get(lastIndex)和remove(lastIndex)就会报ArrayIndexOutOfBoundException异常。如下在客户端进行加锁控制就可以解决以上问题。

import java.util.*;
public class SynCollection2{
    public static Object getLast(Vector list){
        synchronized(list){
            int lastIndex = list.size() - 1 ; 
            return list.get(lastIndex);
        }   
    }   

    public static void deleteLast(Vector list){
        synchronized(list){
            int lastIndex = list.size() - 1 ; 
            list.remove(lastIndex);
        }   
    }   
}

同样,迭代也是这类问题。

迭代器与ConcurrentModificationException

    如果集合在迭代期间被修改了,则在调用hasNext或next的时候,将抛出ConcurrentModificationException。此处采用了“快速失败”的问题。