J.U.C
曲终人散121
努力。
展开
-
java8 CompletableFuture异步编程
参考:1.https://cloud.tencent.com/developer/article/1366581原创 2019-08-22 01:29:06 · 115 阅读 · 0 评论 -
Dubbo中的InternalThreadLocal
InternalThreadLocal 是 ThreadLocal 的一个变种,当配合 InternalThread 使用时,具有比普通 Thread 更高的访问性能。InternalThread 的内部使用的是数组,通过下标定位,非常的快。如果遇得扩容,直接搞一个扩大一倍的数组,然后copy 原数组,多余位置用指定对象填充,完事。而 ThreadLocal 的内部使用的是 hashCode 去获取值,多了一步计算的过程,而且用 hashCode 必然会遇到 hash 冲突的场景,ThreadLocal原创 2020-12-11 00:23:13 · 1110 阅读 · 0 评论 -
BlockingQueue--4 SynchronousQueue
参考1 https://www.cnblogs.com/dwlsxj/p/synchronousqueue-unfair-pattern.html原创 2020-12-01 01:17:58 · 96 阅读 · 0 评论 -
BlockingQueue--3 PriorityBlockingQueue
1 如果数组长度小于64,直接扩容1倍2 否则扩容0.5倍3 默认容量为114 无界阻塞队列,最大Integer.MAX_VALUE - 8原创 2020-12-01 00:38:09 · 85 阅读 · 0 评论 -
ConcurrentSkipListMap与ConcurrentSkipListSet
ConcurrentSkipListSet使用ConcurrentSkipListMap实现,只关注ConcurrentSkipListMap原创 2020-11-29 23:17:56 · 126 阅读 · 0 评论 -
BlockingQueue--3 ArrayBlockingQueue
线程安全,有界,支持公平和非公平锁,ArrayBlockingQueue 使用场景。先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素)有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)队列不支持空元素...原创 2020-11-29 23:16:21 · 75 阅读 · 0 评论 -
BlockingQueue--2 LinkedBlockingQueue
有界,默认为Integer.MAX_VALUE 它如果不指定容量,默认为Integer.MAX_VALUE,也就是无界队列。1 组成构造方法 public LinkedBlockingQueue() { this(Integer.MAX_VALUE); } public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentExceptio原创 2020-11-29 22:48:57 · 108 阅读 · 2 评论 -
BlockingQueue--1概述
1 组成1.1 添加元素add 在添加元素的时候,若超出了度列的长度会直接抛出异常:offer(E e):如果队列没满,立即返回true; 如果队列满了,立即返回false–>不阻塞put(E e):如果队列满了,一直阻塞,直到队列不满了或者线程被中断–>阻塞offer(E e, long timeout, TimeUnit unit):在队尾插入一个元素,,如果队列已满,则进入等待,直到出现以下三种情况:–>阻塞被唤醒等待时间超时当前线程被中断1.2 取出元素re原创 2020-11-29 22:15:06 · 169 阅读 · 1 评论 -
线程池体系(四)--ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor用于定时任务 (1)指定延时后执行任务(2)周期性重复执行任务。原创 2020-11-23 02:17:31 · 350 阅读 · 0 评论 -
线程池体系(三)--ThreadPoolExecutor
1 简述2 组成2 .1 构造函数ThreadPoolExecutor有很多重载的构造函数, public ThreadPoolExecutor(int corePoolSize, //核心线程数 int maximumPoolSize,//最大线程数 long keepAliveTime, //线程空闲时间,如果线程池当前拥有超过corePoolSize的线程,那么多余原创 2020-11-23 02:14:51 · 124 阅读 · 1 评论 -
线程池体系(一)--总体概述
1 Executor线程池顶级接口,只定义了一个执行无返回值任务的方法。public interface Executor { // 执行无返回值任务【本篇文章由公众号“彤哥读源码”原创】 void execute(Runnable command);}2 ExecutorService线程池次级接口,对Executor做了一些扩展,主要增加了关闭线程池、执行有返回值任务、批量执行任务的方法。public interface ExecutorService extends E.原创 2020-11-20 01:25:32 · 86 阅读 · 0 评论 -
Semaphore
Semaphore public Semaphore(int permits) { sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairSync(permits); } /** * NonFair version原创 2020-11-20 01:19:37 · 61 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier基于ReenTrantLock//Generation,该类的对象代表栅栏的当前代,就像玩游戏时代表的本局游戏,利用它可以实现循环等待。barrierCommand表示换代前执行的任务,当count减为0时表示本局游戏结束,需要转到下一局。在转到下一局游戏之前会将所有阻塞的线程唤醒,在唤醒所有线程之前你可以通过指定barrierCommand来执行自己的任务..private static class Generation { boolean broken =原创 2020-11-20 01:14:15 · 90 阅读 · 0 评论 -
CountDownLatch
CountDownLatch中只包含了Sync一个内部类,它没有公平/非公平。基于AQS主要使用shared类型的节点。1 组成只有一个重要的成员 private final Sync sync; public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(cou原创 2020-11-20 00:58:55 · 193 阅读 · 0 评论 -
ReentrantReadWriteLock
ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离, 读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。同步状态的高16位用来表示读锁被获取的次数 ,低16位为写锁状态。2 组成读写锁公用一个 sync对象 public ReentrantReadWriteLock(boolean fair) { sync = fair ?原创 2020-11-16 04:27:06 · 175 阅读 · 0 评论 -
Unsafe
这个类是属于sun.* API中的类,并且它不是J2SE中真正的一部份,因此你可能找不到任何的官方文档,更可悲的是,它也没有比较好的代码文档。1方法分类Unsafe API的大部分方法都是native实现,它由105个方法组成,主要包括以下几类:1 Info相关。主要返回某些低级别的内存信息:addressSize(), pageSize()2 Objects相关。主要提供Object和它的域操纵方法:allocateInstance(),objectFieldOffset()3 Class相关原创 2020-11-16 03:44:31 · 218 阅读 · 0 评论 -
ReentrantLock
2 组成public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();}2.1 主要成员只有一个private final Sync sync;2.2 主要内部类abstract static class Sync extends AbstractQueued原创 2020-11-16 03:38:05 · 65 阅读 · 0 评论 -
AQS
AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些特性的实现独占式锁:void acquire(int arg):独占式获取同步状态,如果获取失败则插入同步队列进行等待; void acquireInterruptibly(int arg):与acquire方法相同,但在同步队列中进行等待的时候可以检测中断; boolean tryAcquireNan原创 2020-11-15 17:33:42 · 150 阅读 · 0 评论 -
java线程安全的集合
一、早期线程安全的集合我们先从早期的线程安全的集合说起,它们是Vector和HashTable1.VectorVector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用2.HashTableHashTable和HashMap类似,不同点是HashTable是线程安全的原创 2020-11-15 02:23:32 · 1149 阅读 · 0 评论 -
ThreadLocal
ThreadLocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同。ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定。类似 Map 的结构存储变量。每个Thread里面都有一个ThreadLocal.ThreadLocalMap成员变量,也就是说每个线程通过ThreadLocal.ThreadLocalMap与ThreadLocal相绑定。1 ThreadLocal//获取值public T get() { Th原创 2020-11-15 02:03:12 · 331 阅读 · 0 评论 -
线程池体系(二)-- ForkJoinPool
ForkJoinPool主要组成:1)ForkJoinPool:是forkjoin框架里面的管理者,最原始的任务都要交给它才能处理。它负责控制整个forkjoin有多少个workerThread,workerThread的创建,激活都是由它来掌控。它还负责workQueue队列的创建和分配,每当创建一个workerThread,它负责分配相应的workQueue。然后它把接到的活都交给workerThread去处理,它可以说是整个forkjoin的容器。2)ForkJoinWorkerThread:fo原创 2020-11-11 22:56:38 · 1020 阅读 · 2 评论 -
StampedLock实现原理
一1 基于CLH锁->一种自旋锁,保证没有饥饿发生,FIFO顺序【先进先出】2 维护一个线程队列,申请不成功的记录在此,每个节点保存一个标记位【locked】,用来判断当前线程是否释放锁3 当线程试图获取锁,取得当前队列的尾部节点作为其前序节点,并使用类似while(pred.locked){}判断前序节点是否已经成功释放锁4 只要前序节点没有释放锁,则表示当前线程还不能继续执行,自旋等待。5 如果前序线程已经释放,则当前线程可以继续执行6 释放锁时线程将自己的节点标记位置为false,那原创 2020-11-10 00:41:39 · 509 阅读 · 0 评论 -
LongAdder与LongAccumulator
1 为什么还要LongAdderLongAdder类是JDK1.8新增的一个原子性操作类。高并发的请求下,AtomicLong的cas自旋算法,竞争激烈,导致性能下降。原创 2020-10-30 23:39:51 · 376 阅读 · 0 评论 -
java中的executor与线程池
executor框架的由来:为每个线程分配一个线程是不太现实的:1.线程的生命周期开销太高2.资源耗尽3.稳定性,不同平台客使用的线程数不同,而且受制于JVM启动参数,Tread构造中的请求栈大小,以及底层操作系统对线程的限制。executor实现了对生命周期的支持,信息收集、应用程序管理机制和性能监视等机制。一、Java中创建线程池很简单,只需要调用Executors中相...原创 2019-09-02 01:11:02 · 233 阅读 · 0 评论 -
java阻塞队列BlockingQueue
BlockingQueue阻塞队列简化了生产者-消费者模型.,适用于线程池和消息中间件。基本方法: 1.add/remove方法 满/空 时抛出异常。element()返回队列。 2.offer(成功返回true)/poll方法 (空返回null)。 返回是否成功。peek()返回队列。 3.put/take...原创 2019-08-29 00:48:27 · 172 阅读 · 0 评论 -
java与线程
一、线程的实现实现线程的3中方式:1.内核线程实现。2使用用户线程实现。3使用用户线程 和轻量级进程实现 。1.内核线程 内核先直接由操作系统支持的线程,由内核完成线程切换,程序不会直接使用内核线程而是使用高级接口--轻量级进程(LWP),这种进程与线程的关系为1:1的模型。优点:每个线程都成为一个调度单元,即使一个线程阻塞了,不会影响其他线程。缺点:(1)基于内核实现,...原创 2019-08-26 02:23:58 · 104 阅读 · 0 评论 -
JMM模型
前言: 现代 引入了高速缓存(cache)解决了处理器与内存速度的矛盾,引入了更为复杂的矛盾。 多核处理器拥有自己独立的内存,又同时共享一个主内存。多个缓存同步到主内存的不一致如何处理呢?为了解决这个问题,每个处理器访问内存都准守一下协议,如:MSI、MESI、MOSI、Synapse、Firefly、DragonProtocal等。JMM模型:1.定义: ...原创 2019-08-26 01:19:49 · 418 阅读 · 0 评论