非ブロックキューConcurrentLinkedQueue

1387 ワード

ブロックキューは、1つのロック(エンキューとアウトは同じロック)または2つのロック(エンキューとアウトは異なるロック)などで実現できます.ブロックではなくループCASを用いて実現することができる.CAS操作により、複数のスレッドが同時に実行され、ロックによってスレッドがブロックされないため、同時性が向上します.例:
package yxxy.queuue;

import java.util.Arrays;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import com.sun.corba.se.impl.protocol.JIDLLocalCRDImpl;

public class TEST1 {

    private static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();

    public static void main(String[] args) throws InterruptedException {
        
        
        Thread[] ths = new Thread[6];
        for(int i=1;it.start());
        Arrays.asList(ths).forEach(t->{
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
    }
}


消費者速度が生産者より大きく、生産者速度が変わらない場合、処理ボトルネックは消費者スレッドがキュー内の要素をそれぞれ取り出す速度にあるため、ロックをかけない方法でキューの要素を取ると処理速度が大幅に向上する.