zoukankan      html  css  js  c++  java
  • 【JAVA并发编程实战】3、同步容器

      同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的

    1、同步容器类的问题

    同步容器类都是线程安全的,但是有些时候还是要客户端加锁来保护复合操作

    就比如vector的操作,如果又两个方法一个获取vector集合的最后一个元素,一个删除最后一个元素

    那么可能两个线程在同时操作的时候,A线程首先正在获取最后一个元素,get(lastElement),而在这个过程中如果B元素正在删除,删除了最后一个(last)然后就可能导致A线程执行失败,报错

    那么如何避免这个问题呢?

    那就是吧获取最后一个位置的索引和获取数据复合操作加锁,使其成为一个原子操作。同理获取索引和删除也是加锁,把容器类作为锁的对象

    2、隐藏迭代器

    如下

    package cn.xf.cp.ch05;
    
    import java.util.HashSet;
    import java.util.Random;
    import java.util.Set;
    
    public class HiddenIterator
    {
        private final Set<Integer> set = new HashSet<Integer>();
        
        //添加与删除操作
        public synchronized void add(Integer i) { set.add(i); }
        public synchronized void remove(Integer i) { set.remove(i); }
        
        public void addTenThings()
        {
            Random r = new Random();
            for(int i = 0; i < 10; ++i)
            {
                add(r.nextInt());
            }
            //注意这里可能会抛出异常,因为这里使用了set,但是没有加锁,也就是应该加上HiddenIterator的对象锁才可以
            //而在输出日志的时候,我们的set会调用toString方法,而这个方法会对容器进行迭代
            //也就是在调用toString方法的时候可能set会被修改,而迭代器在迭代的时候如果计数器被修改那么hasNext或next
            //将抛出ConcurrentModificationException异常
            System.out.println("DEBUG: added ten elements to " + set);
        }
    }
  • 相关阅读:
    第09组 Beta冲刺(3/4)
    第09组 Beta冲刺(2/4)
    第09组 Beta冲刺(1/4)
    第09组 Alpha事后诸葛亮
    王之泰201771010131《面向对象程序设计(java)》第一周学习总结
    正则表达式
    单逻辑运算符和双逻辑运算符的不同之处
    C++11 Java基本数据类型以及转换
    Java中赋值常量的注意事项
    程序命名规则
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5998491.html
Copyright © 2011-2022 走看看