JUC
文章平均质量分 94
程序员的暴击
业精于勤,荒于嬉;行成于思,毁于随。
展开
-
JUC 并发编程
1 什么是 JUCjava.util.concurrent 并发工具包 用来优雅的解决多线程下的高并发问题,JUC 下的大部分类均由Doug Lea 设计开发,此乃神人也!让 Java 程序员膜拜的大神,这个憨态可掬的老者让人又爱又恨!JUC 的基本框架2 线程与进程概念进程:一个程序,或者程序的集合一个进程可以包含多个线程,至少包含一个java默认有2个线程 mian GC线程:进程下的不同操作有线程操作负责的 Thread Runnable Callablejava 无法直接原创 2021-10-04 00:12:04 · 414 阅读 · 0 评论 -
Exchanger 线程数据交换器
基本结构Exchanger——交换器,是JDK1.5时引入的一个同步器, 主要作用是交换数据。Exchanger有点类似于CyclicBarrier, CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。可以看成是一个双向栅栏Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,如果已经有其它线程(Thread2)已经到达了,就会以成对的方式交换各自携带的信息,因此Exchanger非常适合用于两个线程之间的数据交换。原创 2021-10-04 00:09:20 · 5598 阅读 · 0 评论 -
ConcurrentHashMap
JDK 7JDK1.7之前的ConcurrentHashMap使用分段锁机制实现类似分散热点的思想,以减少热点域的冲突,最大并发度受Segment的个数限制。ConcurrentHashMap在对象中保存了一个Segment数组,即将整个Hash表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可。因此,ConcurrentHashMap在多线程并发编程中可是实现原创 2021-10-04 00:08:17 · 529 阅读 · 0 评论 -
ConcurrentSkipListMap
基于跳表的并发安全mapConcurrentSkipListMap以跳表为基础结构的map集合,并且同时支持并发操作,比ConcurrentHashMap最大的优势应该就是有序。内部结构ConcurrentSkipListMap 实现了ConcurrentNavigableMap 接口继承于NavigableMap ,NavigableMap 则继承于sortedMap接口SortedMap提供了一些根据键范围进行查找的功能,比如返回整个Map中 key最小/大的键、返回某个范围内的子Map视图等原创 2021-10-04 00:06:19 · 2330 阅读 · 0 评论 -
ReadWriteLock 读写锁
当读操作远远高于写操作时,这时候使用读写锁让读-读可以并发,提高性能。读-写,写-写都是相互互斥的!提供一个数据容器类内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法public class TestReentrantReadWriterLock { public static void main(String[] args) { DataContainer dataContainer = new DataContainer(); .原创 2021-10-04 00:03:47 · 832 阅读 · 0 评论 -
LinkedTransferQueue
LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。可以算是 LinkedBolckingQueue 和 SynchronousQueue 和合体。LinkedTransferQueue是一种无界阻塞队列,底层基于单链表实现,其内部节点分为数据结点、请求结点;基于CAS无锁算法实现基本原理LinkedTransferQueue 消费者线程获取取数据时原创 2021-10-04 00:02:42 · 3562 阅读 · 0 评论 -
AQS-基于JDK17
全称是 AbstractQueuedSynchronizer,AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。是阻塞式锁和相关的同步器工.在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。我们所熟知的ReentrantLock、CountDownLatch原创 2021-10-04 00:01:08 · 1007 阅读 · 0 评论 -
Semaphore 信号量
信号量,用来限制能同时访问共享资源的线程上限。作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquire)的许可;如果许可不够了,线程需要一直等待,直到许可可用。当线程使用完共享资源后,可以归还(release)许可,以供其它需要的线程使用。和CountDownLatch区别CountDownLatch:同步状态State > 0表示资源不可用,所有线程需要等待;Sta原创 2021-10-03 23:34:45 · 5751 阅读 · 0 评论 -
CyclicBarrier加法计数器
用来进行线程协作,等待线程满足某个计数。构造时设置『计数个数』,每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待,当等待的线程数满足『计数个数』时,继续执行当计数为0的时候还可以重复使用再次计数线程数需要和计数个数保持一致CyclicBarrier可以认为是一个栅栏。一共4个线程A、B、C、D,它们到达栅栏的顺序可能各不相同。当A、B、C到达栅栏后,由于没有满足总数【4】的要求,所以会一直等待,当线程D到达后,栅栏才会放行。public CyclicBarrier(in.原创 2021-10-03 23:33:40 · 196 阅读 · 0 评论 -
Fork/Join
Fork/JoinFork/Join 在 JDK 1.7 , 并行执行任务!提高效率。大数据量!大数据:Map Reduce (把大任务拆分为小任务)Fork/Join框架的使用需要根据实际情况划分子任务的大小Fork/Join 特点:工作窃取由于线程处理不同任务的速度不同,这样就可能存在某个线程先执行完了自己队列中的任务的情况,这时为了提升效率,我们可以让该线程去“窃取”其它任务队列中的任务,这就是所谓的***工作窃取算法***。每个线程都有自己的一个WorkQueue,该工作队列是一个双原创 2021-10-03 23:32:34 · 1648 阅读 · 0 评论 -
ThreadLocal 线程隔离
ThreadLocal而是一个java.lang 包下的线程内部的存储类,可以在线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,实现线程隔离。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。且在线程内部任何地方都可以使用,线程之间互不影响ThreadLocal 提供程内的局部变量,不同的线程之间不会相互程的生命周明内起作用,减少同一个程内多个函数或组件之间一些公共变量传详的复杂度在多线程并发下我们可以通过过 Threadlocal在同一线程原创 2021-10-03 23:31:17 · 3021 阅读 · 0 评论 -
线程池底层原理
线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。程序的运行,本质:占用系统的资源! (优化资源的使用 => 池化技术)线程池、连接池、内存池、对象池///… 创建、销毁。十分浪费资源池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。原创 2021-10-03 23:30:28 · 242 阅读 · 0 评论 -
异步回调 :Future
Future接口Future 设计的初衷: 对将来的某个事件的结果进行建模Future模式,可以让调用方立即返回,然后它自己会在后面慢慢处理,此时调用者拿到的仅仅是一个凭证,调用者可以先去处理其它任务,在真正需要用到调用结果的场合,再使用凭证去获取调用结果。这个凭证就是这里的Future。Future模式下的数据获取:JDK提供了另一个接口——Callable,表示一个具有返回结果的任务:public interface Callable<V> { V call() thr原创 2021-10-03 23:29:33 · 1118 阅读 · 0 评论 -
原子累加器 :LongAdder
LongAdderLongAdder是java8为我们提供的新的类,跟AtomicLong有相同的效果。是对CAS机制的优化继承于Striped64 ,其子类还有LongAccumulator,DoubleAdder,DoubleAccumulatorLongAccumulator 是LongAdder的扩展,让用户自定义累加规则。可以传入函数式接口DoubleAdder操作浮点型,DoubleAccumulator 是DoubleAdder的扩展,让用户自定义累加规则。可以操作函数式接口pub原创 2021-10-03 23:28:28 · 417 阅读 · 0 评论 -
共享模型之内存
JMMJMM 即 Java Memory Model,它定义了主存(共享内存)、工作内存(线程私有)抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响关于JMM的一些同步的约定:1、线程解锁前,必须把共享变量立刻刷回主存。2、线程加锁前,必须读取主存中的最新值到工作内存中!3、加锁和解锁是原创 2021-10-03 23:27:27 · 304 阅读 · 0 评论 -
ReentrantLock
特点可中断可以设置超时时间可以设置为公平锁 (先到先得)支持多个条件变量( 具有多个 WaitSet)支持可重入// 获取ReentrantLock对象private ReentrantLock lock = new ReentrantLock();// 加锁lock.lock();try { // 需要执行的代码}finally { // 释放锁 lock.unlock();} synchronized 和 ReentrantLock区别Synchronize原创 2021-10-03 23:23:09 · 199 阅读 · 0 评论 -
Synchronized 底层原理
Synchronized 底层原理java 对象及对象头java中的锁Monitor-重量级锁Monitor 被翻译为监视器或管程Synchronized是通过对象内部的一个叫做 监视器锁(Monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所原创 2021-10-03 23:20:59 · 1125 阅读 · 0 评论