![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 87
SONNIE在路上
韶华易逝
展开
-
深入Java线程池(源码)
文章目录**线程池与线程对比****线程****线程池**为什么要用线程池?常用线程池的比较三种常见创建线程池的方法,用哪个多?线程池7大参数为什么要用阻塞队列,普通队列不可以吗?拒绝策略当线程数到达了核心线程数后,为什么新的请求进来要先添加到队列中而不是直接创建新的线程?线程池工作原理ThreadPoolExecutor源码分析类结构运行状态execute()addWorker()WorkerrunWorker()getTask线程池与线程对比线程public class ThreadTest {原创 2022-05-04 01:29:30 · 180 阅读 · 0 评论 -
深入理解ReentrantLock(源码)
ReentrantLock同时支持公平锁和非公平锁以及可重入是ReentrantLock的两大重要特点。那么,你知道它的实现原理吗?了解类关系ReentrantLock实现了Lock接口。public class ReentrantLock implements Lock, java.io.Serializable Sync是ReentrantLock内部的一个抽象类,它继承了AQS,也就是抽象队列同步器。abstract static class Sync extends AbstractQ原创 2022-04-27 01:09:38 · 83 阅读 · 0 评论 -
AQS之ReentrantLock
AQS什么是AQSJUC包下的大多数同步器的实现都需要围绕等待队列、条件队列、独占获取、共享获取等基础行为,而这些行为正是由AQS来实现的。AQS全称是AbstractQueuedSynchronizer,意为抽象队列同步器。JDK中提供的大多数同步器,例如Lock、Barrier、Latch等,一般都是通过一个内部类Sync来继承AQS,将同步器所有调用都映射到Sync对应的方法上来实现的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I7M7dDvN-1650992原创 2022-04-27 01:07:47 · 151 阅读 · 0 评论 -
深入Synchronized
文章目录深入Synchronized线程安全问题临界区( Critical Section)Synchronzedsynchronized的使用底层原理synchronized的字节码指令序列**Monitor(管程/监视器)****MESA模型****wait()的正确使用姿势****notify()和notifyAll()分别何时使用****Java语言的内置管程synchronized****Monitor机制在Java中的实现**Java对象的内存布局对象头**使用JOL工具查看内存布局**对象如何原创 2022-04-05 13:09:57 · 325 阅读 · 0 评论 -
Java线程休眠(LockSupport)
Java休眠线程Thread.sleep()必须指定休眠时间休眠时线程状态为TIMED_WAITTING需要捕获InterrupedException异常休眠期间不会释放所持有的锁 public static void main(String[] args) { final String LOCK = "lock"; new Thread(() -> { synchronized (LOCK) {原创 2022-04-04 22:24:46 · 4440 阅读 · 0 评论 -
深入理解CAS
非阻塞同步之CAS概念互斥同步同步是指多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一条(或者是一些,当使用信号量的时候)线程使用;互斥是实现同步的一种手段,临界区、互斥量和信号量都是常见的互斥实现方式。**互斥是方法,同步是目的。**互斥同步是一种最常见的也是最主要的并发正确性保障手段。互斥同步属于一种悲观的并发策略,不论共享的数据是否发生竞争,它都会进行加锁,而这会导致用户态到内核态的转换,因此互斥同步面临的主要问题是进行阻塞唤醒带来的性能开销,同时这种同步方式也被原创 2022-04-04 16:14:07 · 602 阅读 · 0 评论 -
深入理解Java线程
文章目录1.线程基础1.1进程和线程1.1.1进程1.1.2线程1.1.3进程和线程的区别1.1.4进程间通信的方式1.2线程的同步互斥1.2.1概念1.2.2线程同步互斥的控制方法1.3上下文切换1.3.1概念1.3.2查看CPU上下文切换情况1.3.3查看进程 / 线程的上下文切换情况1.4线程生命周期(操作系统层面)1.5查看进程线程的方法1.5.1**windows**1.5.2**linux**1.5.3**Java**1.6Linux系统中线程的实现方式1.7内核模式和用户模式 (Kernel原创 2022-03-29 23:26:53 · 1076 阅读 · 0 评论 -
JMM(Java内存模型)
JVM与JMMJVM(java虚拟机)Java虚拟机在运行程序时会把它管理的内存划分为以上几个区域,每个区域都有各自的用途以及销毁时机。 蓝色区域代表所有线程共享的数据区域,而绿色部分代表的是各个线程的私有数据区域。方法区(Method Area):方法区属于线程共享的内存区域,又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常原创 2022-03-10 18:10:37 · 599 阅读 · 0 评论 -
volatile(二)
volatile内存语义volatile的特性可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性(基于这点,我们通过会认为volatile不具备原子性)。volatile仅仅保证对单个volatile变量 的读/写具有原子性,而锁的互斥执行的特性可以确保对整个临界区代码的执行具有原子性。 64位的long型和double型变量,只要它是vol原创 2022-03-10 18:04:54 · 233 阅读 · 0 评论 -
内 存 屏 障
JVM层面的内存屏障在JSR规范中定义了4种内存屏障:LoadLoad屏障:(指令Load1; LoadLoad; Load2),在Load2及后续读取操作要读取的数据被访问前, 保证Load1要读取的数据被读取完毕。LoadStore屏障:(指令Load1; LoadStore; Store2),在Store2及后续写入操作被刷出前,保证Load1 要读取的数据被读取完毕。StoreStore屏障:(指令Store1; StoreStore; Store2),在Store2及后续写入操原创 2022-03-10 17:28:23 · 165 阅读 · 0 评论 -
如何保证JMM可见性
什么是JMM可见性?可见性是JMM三大特性之一,指的是当一个线程修改了共享变量的值,其他线程都可以看到修改后的值。如何保证可见性?/** * @author sonnie guo * @version 1.0 * @className VisibilityTest * @description * @date 2022/2/20 22:21 */public class VisibilityTest { private boolean flag = true; priva原创 2022-03-10 14:34:56 · 426 阅读 · 0 评论 -
线程池(一)
文章目录线程池1.Callable接口Callable: 返回结果并且可能抛出异常的任务。Runnable和Callable的区别:Future接口FutureTask类Callable两种执行方式借助FutureTask执行借助线程池来运行2.为什么要用线程池,线程池的优势?3.如何使用线程池?4.线程池分类5.线程池使用 步骤6.线程池7大参数7.线程池底层原理/工作机制?8.线程池的拒绝策略**拒绝策略是什么?**JDK内置拒绝策略(以下内置策略均实现了RejectedExecutionHandler原创 2021-05-19 07:06:18 · 130 阅读 · 0 评论 -
JUC(5)——可重入锁
可重入锁1.概述可重入锁又名递归锁。它是指一个线程在外层获取锁之后,再进入该线程内部的方法时就会自动获得这把锁,不会因为之前获取了这把锁后没有释放而阻塞。Java中的synchronized和ReentrantLock都是可重入锁。可重入锁的优点在于可以在一定程度上避免死锁。2.分类2.1 隐式锁即synchronized同步锁(默认是可重入锁)在一个由synchronized关键字修饰的方法或代码块的内部调用本类的其他synchronized修饰的方法或代码块时,是永原创 2021-05-19 07:02:20 · 103 阅读 · 0 评论 -
JUC(6)——阻塞队列
文章目录阻塞队列1.什么是阻塞队列?2.为什么要使用阻塞队列?3.阻塞队列的分类4.阻塞队列的核心用法4.1抛出异常4.2返回布尔4.3一直阻塞4.4超时退出4.5SyschronousQueue阻塞队列1.什么是阻塞队列?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p7IzPIyN-1621378757606)(C:\Users\ThinkPad\AppData\Roaming\Typora\typora-user-images\image-202103270114原创 2021-05-19 07:00:49 · 149 阅读 · 0 评论 -
JUC(4)——线程安全
文章目录线程安全如何保证线程安全互斥同步==主要手段==synchronized关键字实现原理synchronized是重量级操作锁优化Lock特点如何选择synchronized和Locksynchronized 和 lock 的区别非阻塞同步CAS算法1.基本概念2.底层实现3.ABA问题4.如何解决ABA问题?无同步方案**线程本地存储**之ThreadLocal基本介绍使用场景ThreadLocal原理ThreadLocal内存泄漏问题并发工具线程安全如果一段代码可以保证多个线程访问的时候正确操原创 2021-05-19 06:58:29 · 391 阅读 · 1 评论 -
volatile(一)
volatile1.基本概念volatile是JVM提供的轻量级的同步机制,他基本遵守了JMM的规范。volatile主要用来确保将变量的更新操作通知到其他线程。当把变量用volatile修饰后,编译器不会对该变量进行指令重排序;volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此读取volatile类型的变量时总会返回最新写入的值;在访问volatile变量时不会执行加锁操作,因此不会使执行线程阻塞。2.三大特性可见性package com.example.juct原创 2021-05-19 06:55:49 · 144 阅读 · 0 评论 -
JUC(2)——JMM
文章目录JMM1.概念2.主内存与工作内存3.三大特性可见性如何实现?原子性如何保证?**Java中的原子操作实现**有序性如何保证?JMM1.概念JMM,即Java内存模型,它的设计是为了屏蔽各种硬件和OS的内存方法差异,从而实现Java程序在各种平台下都能达到相同的内存访问效果。2.主内存与工作内存JMM定义了程序中各种变量的访问规则,也就是在JVM中将变量值存储到内存中和将变量值从内存中取出这样的底层细节。 【此处的变量和Java语言中的变量有所区别,它包括了实例字段、静态字段和构成数组对象原创 2021-05-19 06:54:20 · 141 阅读 · 0 评论 -
JUC(1)——线程
文章目录1.进程和线程进程概念结构特征进程通信线程概念2.进程和线程的区别3.多线程?概念线程上下文切换什么是线程上下文切换?**减少上下文切换的方法?**守护线程与用户线程创建线程的四种方式线程的生命周期1.进程和线程进程概念进程就是为了更好的描述和控制多道程序环境下程序的并发执行,实现操作系统的并发性和共享性。进程是应用程序在内存中的运行过程,是系统进行资源分配和调度的一个独立单位,这里的系统资源指的是CPU,存储器及其他设备服务于某个进程的时间,因此进程一定是一个动态的、过程性的概念。每个原创 2021-05-19 06:51:11 · 170 阅读 · 0 评论