随笔分类 - 线程并发
摘要:固定运行顺序 比如,必须先 2 后 1 打印 wait notify 版 /** * @author WGR * @create 2021/2/1 -- 14:16 */ @Slf4j(topic = "c.Test25") public class Test25 { static final Ob
阅读全文
摘要:问题描述 哲学家就餐问题也被称为刀叉问题,或者吃面问题。我们先来描述一下这个问题所要说明的事情,这个问题如下图所示: 有 5 个哲学家,他们面前都有一双筷子,即左手有一根筷子,右手有一根筷子。当然,这个问题有多个版本的描述,可以说是筷子,也可以说是一刀一叉,因为吃牛排的时候,需要刀和叉,缺一不可,也
阅读全文
摘要:偏向锁 轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就
阅读全文
摘要:进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序
阅读全文
摘要:线程的 6 种状态 就像生物从出生到长大、最终死亡的过程一样,线程也有自己的生命周期,在 Java 中线程的生命周期中一共有 6 种状态。 new(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminated(被
阅读全文
摘要:AQS 的作用 AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。总之,有了 AQS 之后
阅读全文
摘要:CAS 简介 首先我们来看一下 CAS 是什么,它的英文全称是 Compare-And-Swap,中文叫做“比较并交换”,它是一种思想、一种算法。 在多线程的情况下,各个代码的执行顺序是不能确定的,所以为了保证并发安全,我们可以使用互斥锁。而 CAS 的特点是避免使用互斥锁,当多个线程同时使用 CA
阅读全文
摘要:1.工具概述 作为一个java程序员,最基本的要求就是用java语言编写程序,并能够在jvm虚拟机上正常运行,但是在实际开发过程中,我们所有的程序由于各种各样的原因,并不是总能够正常运行,经常会发生故障或者程序的性能低下等问题,此时我们就需要借助于一些jdk提供的工具来定位问题、分析问题并给出合适的
阅读全文
摘要:死锁 死锁是什么?有什么危害? 什么是死锁 发生在并发中 首先你要知道,死锁一定发生在并发场景中。我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就有可能会导致发生死锁的情况。 互不相让 死锁是一种状态,当两个(或多个)线程(或进程)相互持有
阅读全文
摘要:什么是阻塞队列? 阻塞队列的作用 阻塞队列,也就是 BlockingQueue,它是一个接口,如代码所示: public interface BlockingQueue<E> extends Queue<E>{...} BlockingQueue 继承了 Queue 接口,是队列的一种。Queue
阅读全文
摘要:CopyOnWriteArrayList 有什么特点? 适用场景 读操作可以尽可能的快,而写即使慢一些也没关系 在很多应用场景中,读操作可能会远远多于写操作。比如,有些系统级别的信息,往往只需要加载或者修改很少的次数,但是会被系统内所有模块频繁的访问。对于这种场景,我们最希望看到的就是读操作可以尽可
阅读全文
摘要:ReentrantReadWriteLock 当读操作远远高于写操作时,这时候使用 读写锁 让 读-读 可以并发,提高性能。 类似于数据库中的 select ...from ... lock in share mode 提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法,写锁保护数
阅读全文
摘要:CountDownLatch类 CountDownLatch 类在创建实例的时候,需要在构造函数中传入倒数次数,然后由需要等待的线程去调用 await 方法开始等待,而每一次其他线程调用了 countDown 方法之后,计数便会减 1,直到减为 0 时,之前等待的线程便会继续运行。 构造方法: Co
阅读全文
摘要:该类自 JDK 8 加入,是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合【戳】使用 读锁: long stamp = lock.readLock(); lock.unlockRead(stamp); 写锁: long stamp = lock.writeLock(); lock.un
阅读全文
摘要:volatile 1.volatile保证可见性 代码比较简单,我就不贴出来了。 子线程t从主内存读取到数据放入其对应的工作内存 将flag的值更改为true,但是这个时候flag的值还没有写会主内存 此时main方法main方法读取到了flag的值为false 当子线程t将flag的值写回去后,失
阅读全文
摘要:wait notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在
阅读全文
摘要:所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象 情况1:12 或 21 锁住的为同一对象,2个线程都有可能执行 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { log.deb
阅读全文
摘要:3种线程阻塞唤醒 wait/notify /** * @author WGR * @create 2020/12/29 -- 0:28 */ public class Test6 { private static Object objectLock = new Object(); public st
阅读全文
摘要:ReentrantLock源码探究 后面的流程可以结合:https://www.cnblogs.com/dalianpai/p/14202617.html 一起看 相对于 synchronized 它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量 与 synchroniz
阅读全文
摘要:1、Semaphore 是什么 Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。 可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车
阅读全文