并发queue的简单介绍(一)

来源:互联网 发布:unity3d ios 红色问号 编辑:程序博客网 时间:2024/06/07 00:02

ConcurrentLinkedQueue高性能的队列它是不阻塞的,BlockingQueue是阻塞的队列

ConcurrentLinkedQueue适合在高并发场景下的队列,通过无锁的方式 实现了高并发状态下的

高性能.通常情况下性能要优于BlockingQueue.它是基于链接点的无界的安全队列.该队列的元素

遵循先进先出的原则.该队列不允许null元素.

小案例:

public static void main(String[] args) {
ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>();
q.offer("a");
q.offer("b");
q.offer("c");
q.offer("d");
q.add("e");

System.out.println(q.poll());//从头部取出元素 并从队列里删除
System.out.println(q.size());
System.out.println(q.peek());
System.out.println(q.size());
}

BlockingQueue的实现类

/*
* BlockingQueue的实现类

* ArrayBlockingQueue 基于数组的阻塞队列,在ArrayBlockingQueue维护一定长度的数组
* 以便缓存队列中的数据对象,其内部没有实现读写分离,也就意味着生产和消费不能完全并行,
* 长度是固定的 也叫有界队列

* LinkedBlockingQueue 基于链表的阻塞队列,同ArrayBlockingQueue类似,其内部也维持着一个
* 数据缓冲队列(该队列由一个链表构成),LinkedBlockingQueue之所以能够高效处理并发数据,
* 是因为内部采用分离锁(读写分离两个锁),从而实现生产者和消费者完全分离,他是一个无界队列

* SynchronousQueue 一种没有缓冲的队列,生产者的数据直接被消费者获取并消费


* */

ArrayBlockingQueue<String> array = new ArrayBlockingQueue<>(5);
array.put("a");
array.put("b");
array.add("c");
array.add("d");
array.add("e");
System.out.println(array.offer("a", 5, TimeUnit.SECONDS));


    //阻塞队列
LinkedBlockingQueue<String> q = new LinkedBlockingQueue<>();
q.offer("a");
q.offer("b");
q.offer("c");
q.offer("d");
q.offer("e");
q.offer("f");
List<String> list = new ArrayList<String>();
System.out.println(q.drainTo(list,3));
System.out.println(list.size());
for(String string:list){
System.out.println(string);
}

          List<String> list = new ArrayList<String>();
System.out.println(q.drainTo(list,3));
System.out.println(list.size());
for(String string :list){
System.out.println(string);
}


SynchronousQueue没有任何容量 

正确案例

 final SynchronousQueue<String> q = new SynchronousQueue<>();    Thread t1 = new Thread(new Runnable() {        @Override        public void run() {            try {                System.out.println(q.take());            }catch (InterruptedException e){                e.printStackTrace();            }        }    });    t1.start();    Thread t2 = new Thread(new Runnable() {        @Override        public void run() {            q.add("dddd");        }    });    t2.start();}


原创粉丝点击