美文网首页一些收藏
JUC阻塞队列、原子操作基本原理

JUC阻塞队列、原子操作基本原理

作者: 降龙_伏虎 | 来源:发表于2019-12-16 19:40 被阅读0次

阻塞队列

ArrayBlockingQueue

LinkedBlockingQueue

LinkedBlockingDQueue

...

image.png

操作方法

插入

add/offer()/put

获取(删除)

remove/poll/take

简单demo

public class BlockDemo {

ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue(10);

    {
        init();
    }

    private void init(){
        new Thread(()->{
            while (true){
                try {
                    String data = arrayBlockingQueue.take();
                    System.out.println("receive:"+data);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public void add(String data) throws Exception{
        arrayBlockingQueue.add(data);
        System.out.println("sendData:"+data);
        Thread.sleep(1000L);
    }

    public static void main(String[] args){
        BlockDemo demo = new BlockDemo();
        for (int i = 0; i < 1000; i++) {
            try {
                demo.add("data:"+i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

ArrayBlockingQueue内部实现

  • 采用Object[] 进行数据存储
  • add()时依次添加至下标0~(length-1) '游标'
  • 数组填满后通过Condition 进程阻塞
  • 通过ReentrantLock进行线程安全控制
  • take()时 如果数组为空进行阻塞(直至有新的元素添加)

原子操作 Atomic

image.png
  • 基于CAS实现
    public final int getAndAdd(int delta) {
        return unsafe.getAndAddInt(this, valueOffset, delta);
    }
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

相关文章

  • JUC阻塞队列、原子操作基本原理

    阻塞队列 ArrayBlockingQueue LinkedBlockingQueue LinkedBlockin...

  • juc并发包集合整理

    JUC提供了java并发编程需要的类,主要分几个大模块1 原子类操作2 锁3 阻塞队列4 并发集合5 同步器6 线...

  • 多线程并发编程4-原子操作类源码剖析

    今天来讲一讲原子操作类,JUC包提供了一系列的原子性操作类,这些操作类使用的是CAS非阻塞算法实现的,相比于锁...

  • 阻塞队列和原子操作

    一.BlockingQueue 在Concurrent包中,BlockingQueue很好的解决了多线程中,如何高...

  • [Java]重学Java-原子类

    JUC包下的原子类 JUC就是大名鼎鼎的java并发包,我们今天来看看基于非阻塞性算法的CAS封装的原子类.JUC...

  • JUC 阻塞队列

    概述 阻塞队列解决的问题:在一个容量有限的仓库里面,实现满了就挂起生产线程,空了就挂起消费线程的兼顾性能和安全的数...

  • Java高并发系列——检视阅读(四)

    JUC中原子类 JUC中原子类介绍 什么是原子操作? atomic 翻译成中文是原子的意思。在化学上,我们知道原子...

  • 阻塞队列和线程池浅析(深度好文)

    阻塞队列 概念:当阻塞队列为空时,获取(take)操作是阻塞的;当阻塞队列为满时,添加(put)操作是阻塞的。 好...

  • 9.阻塞队列和线程池

    阻塞队列 特性 队列是空的时候,从队列获取元素的操作会被阻塞 队列是满的时候,往队列添加元素的操作会被阻塞 实现 ...

  • 阻塞队列

    原理 当阻塞队列空时,从队列中读取元素操作被阻塞。当阻塞队列满时,从队列中写入元素操作被阻塞。 已经实现的类 Ar...

网友评论

    本文标题:JUC阻塞队列、原子操作基本原理

    本文链接:https://www.haomeiwen.com/subject/hkpdnctx.html