![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC并发编程
文章平均质量分 93
多线程
猿小羽
技术本身是不值钱的,只有和业务结合的技术才是值钱的!
技术是为了实现某个业务,进而通过业务赚钱!
展开
-
JDK1.8 ConcurrentHashMap 源码分析
JDK1.8 ConcurrentHashMap 源码分析jdk1.8 容器初始化源码分析在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做了处理jdk8的ConcurrentHashMap的数组初始化是在第一次添加元素时完成的构造器一// 没有维护任何变量的操作,如果调用该方法,数组长度默认是16public ConcurrentHashMap() {}构造器二注意,调用这个方法,得原创 2022-03-04 14:57:28 · 4048 阅读 · 2 评论 -
JDK1.7 ConcurrentHashMap 源码分析
JDK1.7 ConcurrentHashMap 源码分析UnsafeUnsafe简介Unsafe类相当于是一个java语言中的后门类,提供了硬件级别的原子操作,所以在一些并发编程中被大量使用。jdk已经作出说明,该类对程序员而言不是一个安全操作,在后续的jdk升级过程中,可能会禁用该类。所以这个类的使用是一把双刃剑,实际项目中谨慎使用,以免造成jdk升级不兼容问题。Unsafe Api这里并不系统讲解Unsafe的所有功能,只介绍和接下来内容相关的操作arrayBaseOffset:获取原创 2022-03-03 12:35:11 · 283 阅读 · 0 评论 -
第九章 - 线程安全集合类
线程安全集合类可以分为三大类。原创 2022-07-14 19:38:49 · 1494 阅读 · 0 评论 -
第八章 - 共享模型之JUC2
第八章 - 共享模型之JUC2Semaphore基本使用信号量,用来限制能同时访问共享资源的线程上限@Slf4j(topic = "c.TestSemaphore")public class TestSemaphore { public static void main(String[] args) { // 1. 创建 semaphore 对象 Semaphore semaphore = new Semaphore(3); // 2.原创 2022-02-28 15:22:20 · 216 阅读 · 0 评论 -
第八章 - 共享模型之JUC
第八章 - 共享模型之JUCAQS 原理概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - CAS 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程原创 2022-02-27 15:59:15 · 514 阅读 · 1 评论 -
第七章 - 共享模型之线程池
第七章 - 共享模型之线程池线程池 (重点)池化技术有很多, 比如线程池、数据库连接池、HTTP连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种 限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用 《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(创建的线程,实际最后要和操作系统的线程做映射,很原创 2022-02-13 16:06:23 · 416 阅读 · 0 评论 -
第六章 - 共享模型之不可变
第六章 - 共享模型之不可变如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改类用 final 修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性日期转换的问题问题提出下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的private static void test() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (原创 2022-02-08 18:34:27 · 2867 阅读 · 0 评论 -
第五章 - 共享模型之无锁
第五章 - 共享模型之无锁Java中 synchronized 和 ReentrantLock 等 独占锁 都是 悲观锁 思想的实现在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的管程即monitor是阻塞式的悲观锁实现并发控制,这章我们将通过非阻塞式的乐观锁的来实现并发控制问题提出有如下需求,保证account.withdraw取款方法的线程安全, 下面使用synchronized保证线程安全/** *原创 2022-02-07 17:16:14 · 244 阅读 · 0 评论 -
第四章 - 共享模型之内存
第四章 - 共享模型之内存之前讲的synchronized底层Monitor主要关注的是访问共享变量时,保证临界区代码的 原子性 。下面进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题Java 内存模型JMM 即 Java Memory Model ,它从Java层面定义了 主存、工作内存 抽象概念,底层对应着CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受 线程上下文切换的影响可原创 2022-02-04 23:58:44 · 3024 阅读 · 0 评论 -
第三章 - 共享模型之管程(四)
第三章 - 共享模型之管程(四)线程状态重新理解线程状态转换 (重点)假设有线程 Thread t情况 1 NEW --> RUNNABLE当调用 t.start( ) 方法时,由 NEW --> RUNNABLE情况 2 RUNNABLE <–> WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用 obj.wait( ) 方法时,t 线程从 RUNNABLE --> WAITING调用 obj.notify( )原创 2022-02-03 17:31:09 · 2460 阅读 · 0 评论 -
第三章 - 共享模型之管程(三)
第三章 - 共享模型之管程(三)wait-notify小故事 - 为什么需要 wait由于条件不满足,小南不能继续进行计算但小南如果一直占用着锁,其它人就得一直阻塞,效率太低于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋直到小M将烟送来,大叫一声 [ 你的烟到了 ] (调用 notify 方法)小南于是可以离开休息室,重新进入竞争锁的队列原理之 wait / notifyOwne原创 2022-01-31 15:23:07 · 199 阅读 · 0 评论 -
第三章 - 共享模型之管程(二)
第三章 - 共享模型之管程(二)Monitor 概念Java 对象头以 32 位虚拟机为例普通对象Mark Word 包含一些标记信息,下面会详细讲解Klass Word 包含了对象的类信息数组对象其中 Mark Word 结构为以32位虚拟机为例:hashcode: 占25位,对象的哈希码age: 分代年龄,age到达一定值时,对象会从幸存者区晋升到老年代biased_lock:代表它是不是偏向锁最后两位:代表对象的状态,如01表示未加锁状态;00表示轻量原创 2022-01-29 17:46:04 · 1849 阅读 · 0 评论 -
第三章 - 共享模型之管程(一)
第三章 - 共享模型之管程(一)文章目录第三章 - 共享模型之管程(一)本章内容共享带来的问题小故事由故事引发的Java代码的体现问题分析临界区 Critical Section竞态条件 Race Conditionsynchronized 解决方案synchronizedsynchronized 原理分析思考面向对象改进方法上的 synchronized不加 synchronized 的方法所谓的“线程八锁”变量的线程安全分析成员变量和静态变量是否线程安全?局部变量是否线程安全?局部变量线程安全分析li原创 2022-01-29 11:45:56 · 227 阅读 · 0 评论 -
第二章 - 线程的创建
第二章 - 线程的创建文章目录第二章 - 线程的创建1、创建和运行线程方法一:直接使用Thread方法二:使用Runnable配合Thread (推荐)方法二的简化:使用lambda表达式简化操作原理之 Thread 与 Runnable 的关系方法三:使用FutureTask与Thread结合2、原理之线程运行栈与栈帧线程上下文切换(Thread Context Switch)3、常用方法start( ) 与 run( )调用start调用run小结sleep( ) 与 yield( )sleep (使原创 2022-01-28 02:22:15 · 799 阅读 · 0 评论 -
第一章 - 基本概念
第一章 - 基本概念文章目录第一章 - 基本概念1、进程与线程进程线程二者对比进程和线程的切换2、并发与并行并发并行小结3、应用应用之异步调用(案例1)设计结论应用之提高效率(案例1)结论1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大原创 2022-01-26 23:58:05 · 207 阅读 · 0 评论