并发编程
文章平均质量分 59
指尖流年999
试试
展开
-
ThreadLocal内存泄漏问题
ThreadLocal是用来存放线程私有的变量的,ThreadLocal主要是用ThreadLocalMap存放变量的,ThreadLocalMap有一个Entry[]数组存放,每个线程Thread都有两个ThreadLocal.ThreadLocalMap变量引用(threadLocals ,inheritableThreadLocals ),Entry是一个弱引用WeakReference<ThreadLocal<?>>。强引用:就是创建一个对象,只要引用还指向堆中的对象原创 2022-02-15 11:15:19 · 1222 阅读 · 0 评论 -
cas详解和unsafe魔法类·
CAS全程 Compare And Swap,比较并交换,它低层调用的是基于硬件平台的汇编指令,指令叫cmpxchg,低层会判断当前系统是多处理器,如果是则cmpxchg指令会添加lock前缀,如果不是就不加lock前缀,java提供的Unsafe方法就是调用汇编指令封装的。cas操作过程:获取内存中的值,然后拿着旧的预期的值和内存中的值作比较,如果比较相等,再用新的值去替换到内存的值,如果内存的值变化了就替换成功,如果没有成功会做自旋重试进行比较。保证每次只有一个线程能够执行。cas是一种..原创 2022-02-14 19:18:57 · 429 阅读 · 0 评论 -
ConcurrentHashMap详解
在jdk1.7版本的时候ConcurrentHashMap是一个分段锁,采用segments数组+HashEntry数组+链表底层一个Segments数组,存储一个Segments对象,每个segment是继承ReentrantLock互斥锁,具有加解锁的功能,一个Segments中储存一个Entry数组,存储的每个Entry对象又是一个链表头结点。put的时候:先对key做hash,找到segment数组中的位置index,然后竞争lock锁,如果获取到了锁,那就获取到了segment原创 2022-02-14 00:30:01 · 3244 阅读 · 0 评论 -
HashMap讲解
实现与map接口,java中用于存储key-value键值对的数据。在jdk1.7及之前版本的hashMap底层使用的是:数组+链表在jdk1.8及以后版本的hashMap底层使用的是:数组+链表+红黑树重要成员变量 DEFAULT_INITIAL_CAPACITY = 1 << 4; Hash表默认初始容量 MAXIMUM_CAPACITY = 1 << 30; 最大Hash表容量 DEFAULT_LOAD_FACTOR = 0....原创 2022-02-13 17:56:00 · 676 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。CyclicBarrier和CountDownLatch的区别CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法进行重置,所以CyclicBarrier可以处理更为复杂的场景。例如,如果计算发生错误,可以重置计数器,并让线程重新执行一次。CyclicBarrier默认原创 2022-02-12 20:25:34 · 345 阅读 · 0 评论 -
CountDownLatch详解
CountDownLatch用来做多线程的计数器吧,用来等待所有线程执行完,如果没有执行完会已知阻塞,计数器底层也是用的state,用来修改state数量,5个线程就是state=5; CountDownLatch也是实现了一个Sync内部类,调用方法是countDown()和await()方法,有一个线程执行完了就执行countDown(),计数器-1,直到全部线程都执行完毕才会解除阻塞。await阻塞,会把所有线程写入到CLH队列中,进行阻塞park.线程执行完会调用countDown方法,原创 2022-02-12 19:19:46 · 474 阅读 · 0 评论 -
Semaphore详解
Semaphore信号量,控制访问资源的线程数目,其实也是依赖AQS的state状态,也是用一个内部类Sync去继承AQS。可以用来做限流操作,springcloud hystrix就是用的这个做限流。创建Semaphore初始化信号量数量,其实就是设置state的值,Semaphore不仅实现互斥锁,还能实现共享锁。调用acquire方法去获取信号量,默认是一个,可以传入获取数量,调用tryAcquireShared去自旋获取,用state去相减,减成功了就获取到信号量了,(如果是共享锁,如果减完原创 2022-02-12 18:55:43 · 262 阅读 · 0 评论 -
ArrayBlockingQueue详解
ArrayBlockingQueue是由数组实现的阻塞队列,是BlockingQueue的实现类。特点:是一个有界的数组,创建的时候传入初始队列大小,底层采用的是ReentrantLock实现阻塞和用condition条件队列每次只能有一个线程读写操作,也就是说生产者和消费者公用一把锁,效率其实一般底层采用数组存储=================================================================Node节点,节点存放pre和next原创 2022-02-12 18:09:05 · 3400 阅读 · 0 评论 -
BlockingQueue详解
BlockingQueue是并发包提供解决并发生产者消费者的问题的。特点:任意时刻只有一个线程生产或者消费操作,是个阻塞队列。队列类型:无限队列(根据内存大小无限增长)和有限队列(定义了队列长度)队列结构一般用数组或者链表实现,FIFO先进先出特点操作方法:常见的4种实现的阻塞队列ArrayBlockingQueue 数组支持的有界队列LinkedBlockingQueue由链接节点支持的可选有界队列 PriorityBlockingQueue由优先级堆支持..原创 2022-02-12 16:33:40 · 533 阅读 · 0 评论 -
ReentrantLock执行
ReentrantLock是基于AQS(AbstractQueuedSynchronizer)类实现的同步器框架,ReentrantLock是一个互斥锁,类似于Synchronized同步锁。其实是ReentrantLock一个内部类Sync继承AbstractQueuedSynchronizer类,Sync还定义了两个子类,实现公平锁(FairSync)和非公平锁(NonfairSync) ,用到的设计模式是模板设计模式。ReentrantLock其实是基于自旋锁 、LockSupport、CAS原子原创 2022-02-11 18:55:45 · 289 阅读 · 0 评论 -
AQS原理
AQS是一个构建锁和同步器的并发框架,是AbstractQueuedSynchronizer的缩写,常见AQS实现的同步器框架有ReentrantLock,Semaphore,Latch,Barrier,BlockingQueue等多种多线程访问共享资源的同步器框架,AQS是一种依赖状态(state)的同步器。AQS具备的五大特性:阻塞等待队列、共享/独占、公平/非公平、可重入、允许中断用AQS构建的同步器框架实现原来都是:1、定义内部类Sync继承AQS类2、将同步器所有调用方法都映射原创 2022-02-11 17:44:22 · 827 阅读 · 0 评论