同步容器类

  • Vetor、HashTable
  • 同步类容器都是安全的,但是在某些场景下可能需要加锁来保护复合操作
  • 这些容器的同步功能都是由JDK的Collections.synchronized***等工厂方法实现的
  • 其底层机制是用synchronized关键字对每个公用方法都进行同步,或者使用Objext mutex对象锁的机制使得每次只能由一个线程访问容器的状态。
  • 在同步容器中,并发的修改,删除会引起容器的异常
  • 不满足互联网对高并发的需求:在线程安全的同时,还能有很好的并发性能。
同步类容器的问题
  • 复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、条件运算(若没有则添加 )。

  • 符合操作在多线程并发的修改容器时,可能会表现出意外的行为,最典型的便是CMD,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器的设计的时候没有考虑并发的问题。

  • Vetor、HashTable对每个公有方法都进行synchronized同步。而工具类是synchronized和Objext mutex实现的对象锁,每次都只有一个线程能访问容器的状态。

同步容器类工厂方法

同步容器类工厂方法

将一个普通容器传递进去变为同步类容器

        List<String> list = new ArrayList<>();
        Collections.synchronizedCollection(list);
使用对象锁

同步容器类根据自身的锁来保护它的每个方法

final Collection<E> c;  // Backing Collection
final Object mutex;     // Object on which to synchronize  

SynchronizedCollection(Collection<E> c) {
            this.c = Objects.requireNonNull(c);
            mutex = this;
        }
           public int size() {
            synchronized (mutex) {return c.size();}
        }
        public boolean isEmpty() {
            synchronized (mutex) {return c.isEmpty();}
        }
        //....
原文地址:https://www.cnblogs.com/renqiqiang/p/9440552.html