java同時データ構造


  • Collection.synchronized List(List)など一連のスレッドセキュリティを構築したList、Set、Mapは基本的なList、Set、Mapの読み書き操作方法にsynchronizedロックを追加しました.
  • 、Jdkのjava.util.co ncurrentは、高性能な一連のスレッドセキュリティのデータ構造
  • を提供している.
    よく使うスレッドの安全なデータ構造:
  • CopyOnWriteArayList:get方法にはロックがなく、add方法:毎回copyで1つのコピーを出し、Reentrant Lockでロックをかけたので、add方法の性能は比較的低い
    public boolean add(E e) {
    	final ReentrantLock lock = this.lock;
    	lock.lock();
    	try {
    	    Object[] elements = getArray();
    	    int len = elements.length;
                //            
    	    Object[] newElements = Arrays.copyOf(elements, len + 1);
                //    
    	    newElements[len] = e;
                //       
    	    setArray(newElements);
    	    return true;
    	} finally {
                //   
    	    lock.unlock();
    	}
        }
    である.結論:読みすぎて書き込みが少ない高合併環境で、CopyOnWriteArayListを使用する. システムの性能を高めることができます.ただし、読みすぎが少ない場合はCopyOWriteArayList の性能はまだVectorに及ばないです.
  • CopyOWriteAraySet:内部実装はCopyOWriteArayListに完全に依存している. 
  • ConcerenthashMap:スレッド合併のために設計されたhashMapは、get()操作はロックなしで、put()操作のロック粒度はsynchronizedのhashMapよりも小さいので、全体性能はsynchronizedのhashMapより優れています.
  • 同時Que: JDKは2セットの実現を提供します.
         (1): ConcerentlinkedQueに代表される高性能チームです. 
                   シーン:高合併シーンに適したキューは、ロックなしで高機能かつダウンを実現し、ブロッキングQueよりも性能が優れています.
         (2): BlockingQueインターフェースは渋滞行列の代表です.    
                   シーン:BlockingQueは、高合併時のキュー性能を向上させるのではなく、マルチスレッド間のデータ共有を簡略化することにあります.主に生産者-消費者モードに使われます.読み書きが渋滞する.主にArayBlocking QueとLinked Blocking Queがあります.
      5. 同時Deque(双端列):具体的にはJDKソースを参照してください.Linked List、ArayDeque、Linded Blocking DequeはいずれもDequeインターフェースを実現しました.