[TOC]一、内存屏障内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,它的作用有两个:一是保证特定操作的执行顺序;二是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)。由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序,也就...
[TOC]一、基本概念对于一个线程的执行代码而言,我们总是习惯性认为代码的执行总是从上到下,有序执行。但为了提升性能,编译器和处理器通常会对指令序列进行重新排序。Java规范规定JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化执行的结果一致,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。指令重排序类型(1)编译器优化的重排序:编译器在不改变单线程程序语义的前提下,...
[TOC]一、volatile改进两阶段终止模式1.1 示例import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date 2022/10/29 * Description volatile实现两阶段终止 */ @Slf4j(topic = "c.Test09") public class ...
[TOC]一、Java内存模型JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。JMM 体现在以下几个方面原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受 cpu 缓存的影响有序性:保证指令不会受 cpu 指令并行优化的影响简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)...
[TOC]一、固定运行顺序题目:有两个线程分别输出1和2,要求输出结果必须先2后1打印1.1 wait notify 版import lombok.extern.slf4j.Slf4j; /** * @author lilinchao * @date 2022-10-26 * @description 固定运行顺序 wait notify实现 * 必须先2后1打印 **/ @S...
[TOC]一、概述ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。相对于 synchronized 它具备如下特点:可中断synchronized锁加上去不能中断,a线程应用锁,b线程不能取消掉它可以设置超时时间synchronized它去获取锁时,如果对方持有锁,那么它就...
[TOC]一、死锁死锁产生的四个必要条件互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。死锁示例有这样的情况:一个线程需要同时获取多把锁,这时就容易发...
[TOC]一、背景介绍现在有一个房子,在房子中有卧室和书房:书房可以用来学习卧室可以用来睡觉但是学习和睡觉两件事不冲突,不过学习和学习会出现冲突,睡觉和睡觉之间存在冲突。二、示例当整个房子只有一把锁时现在t1线程要获取锁进房间学习,t2线程要进房间睡觉import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date ...
[TOC]一、概念LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。park,unpark这两个方法都是LockSupport类名下的方法,park用来暂停线程,unpark用来将暂停的线程恢复。先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是...