27.并发编程之volatile原理

[TOC]一、内存屏障内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,它的作用有两个:一是保证特定操作的执行顺序;二是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)。由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序,也就...

Java 2022-10-31 PM 489次 0条

26.并发编程之有序性介绍

[TOC]一、基本概念对于一个线程的执行代码而言,我们总是习惯性认为代码的执行总是从上到下,有序执行。但为了提升性能,编译器和处理器通常会对指令序列进行重新排序。Java规范规定JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化执行的结果一致,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。指令重排序类型(1)编译器优化的重排序:编译器在不改变单线程程序语义的前提下,...

Java 2022-10-30 PM 651次 0条

25.并发编程之Balking模式

[TOC]一、volatile改进两阶段终止模式1.1 示例import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date 2022/10/29 * Description volatile实现两阶段终止 */ @Slf4j(topic = "c.Test09") public class ...

Java 2022-10-29 AM 479次 0条

24.并发编程之可见性介绍

[TOC]一、Java内存模型JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。JMM 体现在以下几个方面原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受 cpu 缓存的影响有序性:保证指令不会受 cpu 指令并行优化的影响简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)...

Java 2022-10-27 PM 469次 0条

23.同步模式之顺序控制

[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...

Java 2022-10-26 PM 503次 0条

22.并发编程之ReentrantLock简介

[TOC]一、概述ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。相对于 synchronized 它具备如下特点:可中断synchronized锁加上去不能中断,a线程应用锁,b线程不能取消掉它可以设置超时时间synchronized它去获取锁时,如果对方持有锁,那么它就...

Java 2022-10-25 PM 517次 0条

21.并发编程之活跃性分析

[TOC]一、死锁死锁产生的四个必要条件互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。死锁示例有这样的情况:一个线程需要同时获取多把锁,这时就容易发...

Java 2022-10-24 PM 495次 0条

20.并发编程之多把锁问题

[TOC]一、背景介绍现在有一个房子,在房子中有卧室和书房:书房可以用来学习卧室可以用来睡觉但是学习和睡觉两件事不冲突,不过学习和学习会出现冲突,睡觉和睡觉之间存在冲突。二、示例当整个房子只有一把锁时现在t1线程要获取锁进房间学习,t2线程要进房间睡觉import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date ...

Java 2022-10-23 PM 564次 0条

19.并发编程之park与unpark基本使用

[TOC]一、概念LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。park,unpark这两个方法都是LockSupport类名下的方法,park用来暂停线程,unpark用来将暂停的线程恢复。先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是...

Java 2022-10-22 PM 701次 0条

18.并发编程之保护性暂停模式

[TOC]一、基本概念保护性暂停(Guarded Suspension):用在一个线程等待另一个线程的执行结果时使用。保护性暂停的暂停就是当条件不满足的时候就去进行wait等待。要点有一个结果需要从一个线程传递到另一个线程,让它们关联同一个GuardedObject。如果有结果不断从一个线程到另一个线程那么此时就不能使用这个保护性暂停模式了,可以使用消息队列(见生产者/消费者)。JDK中,j...

Java 2022-10-20 PM 540次 0条