![](https://img-blog.csdnimg.cn/ca259d44705b46babb4ed1093ede6068.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java并发编程
文章平均质量分 69
java并发编程
Andycuigo
wanna and got
展开
-
LockSupport
LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的。使用它我们可以实现很多功能,今天主要就是对这个工具类的讲解,希望对你有帮助:一、LockSupport简介1、LockSupport是什么刚刚开头提到过,LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。注意上面的123方法,都有一个blocker,这个blocker是用来记录线程被阻原创 2023-05-28 21:13:49 · 686 阅读 · 0 评论 -
JUC-线程池Executor
少走弯路ExecutorThreadPoolExecutorFixedThreadpoolSingleThreadExecutorCacheThreadPoolRejectedExecutionHandlerCallable和FutureExecutors写的挺好的https://www.jianshu.com/p/8d68c4b9d12ehttps://blog.csdn.net/weixin_40304387/article/details/80508236...原创 2021-02-05 14:52:04 · 63 阅读 · 0 评论 -
JUC-原子操作类总结
JUC-原子操作类总结怎么理解呢原子性表示一个或者多个操作,要么全部执行完,要么一个也不执行。不能出现成功一部分失败一部分的情况。典型的原子性问题在多线程中,如果多个线程同时更新一个共享变量,可能会得到一个意料之外的值。比如 i=1 。A 线程更新 i+1 、B 线程也更新 i+1。通过两个线程并行操作之后可能 i 的值不等于 3。而可能等于 2。因为 A 和 B 在更新变量 i 的时候拿到的 i 可能都是 1,这就是一个典型的原子性问题。实现原子性加 Synchronized 同步锁从 J原创 2021-02-04 14:31:29 · 204 阅读 · 0 评论 -
ConcurrentSkipListMap理解&源码分析
少走弯路https://www.cnblogs.com/skywang12345/p/3498556.html转载 2021-02-02 17:06:27 · 156 阅读 · 0 评论 -
JUC-ConcurrentHashMap 源码分析
JUC-ConcurrentHashMap 源码分析前言ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所ConcurrentHashMap 多用在并发编程的场景中保证安全性。JDK1.7 和 JDK1.8 变化ConcurrentHashMap 和 HashMap 的实现原理是差不多的,在此基础上支持并发操作。在 JDK1.7 的实现上, ConrruentHashMap由多个 Segment 组成, 通过ReentrantLock 来进原创 2021-02-02 15:26:23 · 97 阅读 · 0 评论 -
深入浅出 CopyOnWriteArrayList
什么是 CopyOnWriteArrayList?CopyOnWriteArrayList 我们可以拆分为两个词来理解,一个是 CopyOnWrite,一个是 ArrayList,ArrayList 相信 使用 Java 的朋友都知道。那么什么是 CopyOnWrite 呢?CopyOnWrite写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同转载 2021-02-02 10:46:03 · 112 阅读 · 0 评论 -
Phaser基本理解和用法
Phaser参考博客:https://blog.csdn.net/tianshi_kco/article/details/52975468总结java7中引入了一种新的可重复使用的同步屏障,称为移相器Phaser,Phaser相比较于CyclicBarrier和CountDownLatch更加灵活。特性一:CountDownLatch、CyclicBarrier只适用于固定数量的参与者,而Phaser适用于可变数目的屏障。特性二:移相器Phaser可能是分层的,这允许你以树形结构来安排移相器Ph原创 2021-02-01 15:46:34 · 629 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore基础使用
CountDownLatch、CyclicBarrier、Semaphore基础使用CountDownLatchCountDownLatch是一个同步工具类,从命名可以解读到 countdown 是倒数的意思,类似于我们倒计时的概念。CountDownLatch提供了两个方法,一个是 countDown,一个是 await, CountDownLatch初始化的时候需要传入一个整数,在这个整数倒数到 0 之前,调用了 await 方法的程序都必须要等待,然后通过 countDown 来倒数。使用案原创 2021-01-29 17:48:22 · 104 阅读 · 0 评论 -
JUC同步条件变量Condition
JUC同步条件变量ConditionCondition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒,参考Synchronized/wait()/notify/notifyAll()Condition 的基本使用// 1.构造带有lock和condition的线程// 2.try { lock.lock(); condition.await();//或者condition.signal/signalAll() //do原创 2021-01-28 17:24:24 · 148 阅读 · 0 评论 -
JUC并发工具类ReentrantLock原理分析
JUC并发工具类ReentrantLock原理分析LockLock 在 J.U.C 中是最核心的组件,绝大部分的组件都有用到了 Lock。Lock 简介在 Lock 接口出现之前,Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场景中会存在一些短板,也就是它并不适合于所有的并发场景。但是在 Java5 以后,Lock 的出现可以解决synchronized 在某些场景中的短板,它比 synchronized 更加原创 2021-01-28 16:08:13 · 150 阅读 · 0 评论 -
线程安全性的原理分析
线程安全性的原理分析volatilevolatile 的作用volatile 可以使得在多处理器环境下保证了共享变量跨线程1.写入的内存可见性、2.禁止指令重排序。volatile如何保证?汇编指令显示,在修改带有 volatile 修饰的成员变量时,会多一个 lock 指令。lock是一种控制指令,在多处理器环境下,lock 汇编指令可以基于总线锁或者缓存锁的机制来达到可见性的一个效果。Java 编译器在生成指令序列的适当位置会插入内存屏障来禁止特定类型的处理器的重排序。硬件引发的问题CP原创 2021-01-27 17:02:57 · 219 阅读 · 0 评论 -
回顾线程的竞争机制
回顾线程的竞争机制再来回顾一下线程的竞争机制对于锁升级这块的一些基本流程。方便理解假设有这样一个同步代码块,存在 Thread#1、Thread#2 等多个线程synchronized(lock){ //do something}情况一:只有 Thread#1 会进入临界区;情况二:Thread#1 和 Thread#2 交替进入临界区,竞争不激烈;情况三:Thread#1/Thread#2/Thread3… 同时进入临界区,竞争激烈;偏向锁此时当 Thread#1 进入临界区时,JV原创 2021-01-27 14:42:43 · 162 阅读 · 0 评论 -
重量级锁的基本原理
重量级锁的基本原理当轻量级锁膨胀到重量级锁之后,意味着线程只能被挂起阻塞来等待被唤醒了。重量级锁的 monitor加 了 同 步 代 码 块 以 后 , 在 字 节 码 中 会 看 到 一 个monitorenter 和 monitorexit。每一个 JAVA 对象都会与一个监视器 monitor 关联,我们可以把它理解成为一把锁,当一个线程想要执行一段被synchronized 修饰的同步方法或者代码块时,该线程得先获取到 synchronized 修饰的对象对应的 monitor。mo原创 2021-01-27 14:38:33 · 1159 阅读 · 0 评论 -
自旋锁基本原理
自旋锁基本原理轻量级锁在加锁过程中,用到了自旋锁所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的。注意,锁在原地循环的时候,是会消耗 cpu 的,就相当于在执行一个啥也没有的 for 循环。所以,轻量级锁适用于那些同步代码块执行的很快的场景,这样,线程原地等待很短的时间就能够获得锁了。自旋锁的使用,其实也是有一定的概率背景,在大部分同步代码块执行的时间都是很短的。所以通过看似无异议的原创 2021-01-27 14:17:47 · 1543 阅读 · 0 评论 -
偏向锁的基本原理
偏向锁的基本原理前面说过,大部分情况下,锁不仅仅不存在多线程竞争,而是总是由同一个线程多次获得,为了让线程获取锁的代价更低就引入了偏向锁的概念。怎么理解偏向锁呢?当一个线程访问加了同步锁的代码块时,会在对象头中存储当前线程的 ID,后续这个线程进入和退出这段加了同步锁的代码块时,不需要再次加锁和释放锁。而是直接比较对象头里面是否存储了指向当前线程的偏向锁。如果相等表示偏向锁是偏向于当前线程的,就不需要再尝试获得锁了偏向锁的获取和撤销逻辑首先获取锁 对象的 Markword,判断是否处于可偏向状原创 2021-01-27 14:14:54 · 6441 阅读 · 0 评论 -
多线程基本原理和锁的基本原理
多线程基本原理线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提升并发吞吐量线程安全:如果多个线程访问同一个共享对象,在不需额外的同步以及调用端代码不用做其他协调的情况下,这个对象的结果与我们预期规定的结果保持一致,那说明这个对象是线程安全的。多线程对于共享变量访问带来的安全问题多个线程同时对一个变量修改,就会存在数据安全问题。线程不安全实原创 2021-01-26 17:43:12 · 1020 阅读 · 0 评论 -
JAVA线程的生命周期
线程的生命周期Java线程既然能够创建,那么也势必会被销毁,所以线程是存在生命周期的,那么我们接下来从线程的生命周期开始去了解线程。State一共有6种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED)public enum State { /** * Thread state for a thread which has not yet started. */ NEW,原创 2021-01-04 13:19:58 · 78 阅读 · 0 评论