Java容器类的线程安全

2014-11-23 22:03:21 · 作者: · 浏览: 116

  1、Java容器类的关系图


  Collection


  ├List 接口


  │├LinkedList 链表


  │├ArrayList 顺序结构动态数组类


  │└Vector 向量


  │ └Stack 栈


  └Set


  Map


  ├HashTable


  ├HashMap


  └WeakHashMap List接口


  2、线程安全的和线程不安全的


  Vector和HashMap是线程安全的


  LinkedList、ArrayList和HashMap是线程不安全的


  由于同步需要花费时间,因此线程安全的执行效率要低于线程不安全的


  3、在多线程操作


  案例:多线程操作导致List报NoSuchElementException


  java.util.NoSuchElementException


  at java.util.LinkedList.remove(LinkedList.java:788)


  at java.util.LinkedList.removeFirst(LinkedList.java:134)


  at freemarker.core.RegexBuiltins.getPattern(RegexBuiltins.java:138)


  解决方法:


  调用Collections的同步List


  List items = Collections.synchronizedList(new LinkedList ());


  public void remove() {


  if (!items.isEmpty()) {


  return items.remove(0);


  }


  }


  设置标志,同步


  LinkedList items = new LinkedList ();


  String flag="abcdef";


  public void remove() {


  synchronized(flag){


  if (!items.isEmpty()) {


  return items.removeFirst();


  }


  }


  编辑特别推荐: