阻塞队列BlockingQueue实战及其原理分析
1.BlockingQueue介绍1. Queue(队列)顶层接口add(E) 添加元素,成功返回true,否则返回异常offer(E) 添加元素,成功返回true,否则返回falseremove() 返回并移除队首元素,队列为空返回异常poll()返回并移除队首元素,队列为空返回nullpeek() 获取队首元素,队列为空则返回nullBlockingQueue继承于Queue,提供了阻塞的特性,入队和出队都有常用的方法入队:put(E) offer(E) .
阻塞队列BlockingQueue实战及其原理分析二
1. SynchronousQueue介绍synchronousQueue是一个没有数据缓冲的阻塞队列,应用在newCachedThreadPool中,它的大小为0,每次取数据需要阻塞线程,存数据也需要阻塞线程。默认非公平锁,底层使用桟结构实现,公平锁使用队列结构实现。底层加锁使用CAS+自旋(默认512次)+(park/unpark)的形式保证性能。1.1 synchronousQueue实战两个生产者两个消费者:出现后进先出现象。符合非公平锁特性,底层使用桟结构实现。i
并发编程之ForkJoin工作原理分析
1.任务类型1. CPU密集型任务 CPU密集型任务主要是用来发挥CPU的功能,加解密,计算等任务时推荐线程数是CPU核数的1-2倍。2. IO密集型任务 IO密集型任务是主要用于读写的任务,文件读写,数据库读写,通信等任务等,一般情况下推荐线程数是CPU核数的很多倍。线程数计算方法公式:线程数=CPU核数*(1+平均等待时间/平均工作时间) 最终的线程数结果需要压测获得,监测JVM的运行情况以及CPU的负载情况。1....
Future&CompletableFuture&Disruptor实战
1. 为什么需要callable接口传统的创建线程方式有两种:继承Thread和实现Runnable接口,两个都没有返回值,而且不能抛出异常。为了解决这个问题,java可以通过实现callable接口,重写call方式返回任务结果。@FunctionalInterfacepublic interface Runnable { public abstract void run();}@FunctionalInterfacepublic interface Callable<
JDK7与JDK8中的HashMap源码解析
1.jdk1.7 HashMaphashMap的数据结构:数组+链表ArrayList的初始值:10hashMap中为什么不用list的add方法,hashMap是key-value结构,在get(key)时需要遍历整个数组,效率上不如list.get(下标)效率高put操作:1.使用hashcode求余数组长度得出index数组下标值2.new Entry元素放入table[index]中1.1 构造方法构造方法,默认初始内存16,默认参数DEFAULT_LOAD_F
JDK7中ConcurrentHashMap源码解析
1. hashMap中扩容transfer时可能出现循环链表问题1. 使用头插法void addEntry(int hash, K key, V value, int bucketIndex) {//如果hashMap大小大于等于阈值并且数据元素不为空扩容 if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length);
Zookeeper选举Leader源码剖析(一)
1.启动或leader宕机选举流程2.客户端与服务端交互流程(NIO或Netty)3.写入数据的ZAB一致性协议(如何保证消息的顺序性)4.Watch监听触发机制。
springboot自动装配总结
如何实现一个 Starter?记录一下springboot自动装配详解实战碰到得问题。1.springboot自动装配,新建一个父工程,建立两个module-模块(自动装配工程和要测试得工程)2.自动装配工程:新建一个自动装配类和META-INF\spring.factories文件3.测试工程:在java包下建一个包(XXX.XXXX),新建启动类使用@springbootApplication,很重要;test包下面也建包(XXX.XXXX),新建测试类测试.总结:1.测试工程必须要建一个启动类spri
今日推荐
周排行