同步类容器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nangeali/article/details/82344527

同步类容器

是线程安全的

但是,在某些场景下
可能需要加锁来保护复合操作

复合类操作,比如
迭代,反复访问元素、遍历完容器中所有元素
跳转,根据指定的顺序,找到当前元素的下一个元素
以及条件运算等

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

同步类容器,比如
Vector、HashTable
这些容器的同步功能,其实
都是有JDK的Collections.Synchronized等,工厂方法去创建实现的

底层的机制,无非就是用传统的synchronized关键字
对每个公用的方法都进行同步,使得每次只能有一个线程访问容器的状态

这明显不是互联网高并发的需求
在保证线程安全的同时,必须有有足够好的性能

package com.bjsxt.base.coll012;

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

/**
 * 多线程使用Vector或者HashTable的示例(简单线程同步问题)
 */
public class Tickets {

    public static void main(String[] args) {
        //初始化火车票池并添加火车票:避免线程同步可采用Vector替代ArrayList  HashTable替代HashMap

        final Vector<String> tickets = new Vector<String>();

        for(int i = 1; i<= 1000; i++){
            tickets.add("火车票"+i);
        }


        for(int i = 1; i <=10; i ++){
            new Thread("线程"+i){
                public void run(){
                    while(true){
                        if(tickets.isEmpty()) break;
                        System.out.println(Thread.currentThread().getName() + "---" + tickets.remove(0));
                    }
                }
            }.start();
        }
    }
}

运行
这里写图片描述

猜你喜欢

转载自blog.csdn.net/nangeali/article/details/82344527