Java并发编程---同步类容器

水深无声 2022-06-02 02:56 508阅读 0赞

一.概念

同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素),跳转(根据指定的顺序找到当前元素的下一个元素),以及条件运算.这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModifiCationException,原因是当容器迭代的过程中,被并发地修改了内容,这是由于早期迭代器设计的时候没有考虑并发修改的问题.

同步类容器:如古老的Vector,HashTable.这些容器的同步功能其实都是由JDK的Collection.synchronized***等工厂方法去创建实现的.其底层的机制无非就是用传统的synchronized关键字对每个公用的方法都进行同步,使得每次只能有一个线程访问容器的状态.这很明显不满足我们今天互联网时代高并发的需求,在保证线程安全的同时,也必须要有足够好的性能.

二.代码示例

  1. package com.thread.container;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Vector;
  7. /**
  8. * 多线程使用Vector或者HashTable的示例(简单线程同步问题)
  9. * @author lhy
  10. * @time 2017.12.31
  11. */
  12. public class Tickets {
  13. public static void main(String[] args) {
  14. // TODO Auto-generated method stub
  15. //初始化火车票池并发添加火车票:避免线程同步可采用Vector替代ArrayList,HashTable替代HashMap
  16. final Vector<String> tickets = new Vector<String>();
  17. //Map<String, String> map = Collections.synchronizedMap(new HashMap<String,String>());
  18. for(int i=1; i<=1000; i++){
  19. tickets.add("火车票" + i);
  20. }
  21. // for(Iterator iterator = tickets.iterator(); iterator.hasNext();){
  22. // String target = (String) iterator.next();
  23. // tickets.remove(20);
  24. // }
  25. for(int i=1; i<=10; i++){
  26. new Thread("线程" + i){
  27. public void run(){
  28. while(true){
  29. if(tickets.isEmpty()) break;
  30. System.out.println(Thread.currentThread().getName() + "----" + tickets.remove(0));
  31. }
  32. }
  33. }.start();
  34. }
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,508人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java并发编程---同步容器

    一.概念 同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素),跳转(根据指定的顺序找到当前元素的下