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