J.U.C
文章平均质量分 68
此专栏仅供学习参考,不做其他用途!
[J.U.C黑马程序员B站 https://www.bilibili.com/video/BV16J411h7Rd?from=search&seid=15097202051496175883&spm_id_from=3]的相关笔记整理以及个人的一些总结完善.
脱氨垃圾
这个作者很懒,什么都没留下…
展开
-
进程与线程,并行与并发
进程与线程,并行与并发文章目录进程与线程,并行与并发1.进程与线程2.进程和线程的对比3.并行与并发1.进程与线程1.进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动原创 2021-10-25 08:49:10 · 133 阅读 · 0 评论 -
五种状态和六种状态
五种状态和六种状态文章目录五种状态和六种状态1.五种状态2.六种状态1.五种状态这是从 操作系统 层面来描述的【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行【运行状态】指获取了 CPU 时间片运行中的状态当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 C原创 2021-10-25 08:44:25 · 1604 阅读 · 0 评论 -
主线程和守护线程
主线程和守护线程文章目录主线程和守护线程默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束.log.debug("开始运行...");Thread t1 = new Thread(() -> { log.debug("开始运行..."); sleep(2); log.debug("运行结束...");}, "daemon");// 设置该线程为守护线程t1.setDa原创 2021-10-25 08:40:30 · 261 阅读 · 0 评论 -
Java线程常用方法分析
Java线程常用方法分析文章目录Java线程常用方法分析1.start 与 run2.sleep 与 yield3.join3.1基本使用3.2等待多个结果3.3有时效的join4.interrupt 方法详解5.不推荐的方法1.start 与 run1.run//----------调用 run-----------------------public static void main(String[] args) { Thread t1 = new Thread("t1") { @Ov原创 2021-10-25 08:27:51 · 94 阅读 · 0 评论 -
Java线程
Java线程文章目录Java线程1.创建和运行线程2.线程运行3.查看进程线程的方法4.栈与栈帧5.线程上下文切换6.线程常用方法8.Thread 与 Runnable 的关系1.创建和运行线程1.使用Thread接口的匿名实现类创建//-------创建线程对象-----------------Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start();//-------创建指定名称的原创 2021-10-25 07:51:59 · 117 阅读 · 0 评论 -
SpringMVC拦截器interceptor
SpringMVC拦截器interceptor文章目录SpringMVC拦截器interceptor1.概念2.拦截器和过滤器的区别3.拦截器快速入门1.概念Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain) 。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。2.拦截器和过滤器的区别原创 2021-10-21 08:42:06 · 64 阅读 · 0 评论 -
同步模式-交替输出
同步模式-交替输出文章目录同步模式-交替输出1.介绍2.wait/notifyAll 方式3.ReentrantLock 实现4. park/unpark 实现1.介绍线程1输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出 abcabcabcabcabc 怎么实现。2.wait/notifyAll 方式/** * wait-notify版 * * 等待标记法 * a 1 * b 2 * c 3 *///定义锁对象static fi原创 2021-10-19 15:02:39 · 101 阅读 · 0 评论 -
同步模式-顺序控制
同步模式-顺序控制文章目录同步模式-顺序控制1.wait/notify版2.ReentrantLock版1.wait/notify版/** * 同步模式-顺序控制 */@Slf4j(topic = "c.TestSyncModel_SequenceControl")public class TestSyncModel_SequenceControl { /** * 先执行t2后执行t1 * wait-notify()实现 */ //定义锁对象原创 2021-10-19 14:59:28 · 97 阅读 · 0 评论 -
ReentrantLock 可重入锁
ReentrantLock 可重入锁文章目录ReentrantLock 可重入锁1.特点2.基本语法3.可重入4.可打断5.锁超时6.使用锁超时解决哲学家就餐问题7.公平锁8.条件变量9.用ReentrantLock改写送烟送外卖代码1.特点相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁(先进先出)构造参数为true表示公平锁。支持多个条件变量(休息室)(条件不满足时进入waitSet等待)与 synchronized 一样,都支持可重入。2.基原创 2021-10-19 14:57:19 · 133 阅读 · 0 评论 -
锁的活跃性
锁的活跃性文章目录锁的活跃性1.死锁1.1介绍1.2死锁代码1.3死锁定位经典死锁问题-哲学家进餐问题2.活锁3.饥饿1.死锁1.1介绍有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁。t1线程获得A对象锁,接下来想获取B对象的锁, t2线程获得B对象锁,接下来想获取A对象的锁。1.2死锁代码static final Object A = new Object();static final Object B = new Object();@Testpublic void原创 2021-10-19 14:51:38 · 249 阅读 · 0 评论 -
锁的粒度粗细
锁的粒度粗细文章目录锁的粒度粗细1.锁住不同的对象会有不同的效率1.锁住不同的对象会有不同的效率1.锁住大对象,会造成低并发程度/** * 直接锁大对象 */@Slf4j(topic = "c.BigRoom")class BigRoom { public void sleep() { synchronized (this) { //直接锁住当前对象 log.debug("睡觉2小时"); try {原创 2021-10-19 14:43:01 · 177 阅读 · 0 评论 -
重新理解线程状态转换
重新理解线程状态转换文章目录重新理解线程状态转换1.线程状态转换2.不同过程分析情况1:NEW-->RUNNABLE情况2:RUNNABLE<-->WAITING情况3:RUNNABLE<-->WAITING情况4:RUNNABLE<-->WAITING情况5:RUNNABLE<-->TIMED_WAITING情况6:RUNNABLE<-->TIMED_WAITING情况7:RUNNABLE<-->TIMED_WAITING情况原创 2021-10-19 14:39:38 · 76 阅读 · 0 评论 -
park和unpark
park和unpark文章目录park和unpark1.基本使用2.演示代码3.特点4.park()/unpark()底层原理(重要)5.源码分析1.基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象)先 park 再 unpark2.演示代码/** * 暂停当前线程 * LockSupport.park(); * 恢复某个线程的运行 * LockSu原创 2021-10-19 14:26:42 · 108 阅读 · 0 评论 -
异步模式-生产者/消费者
异步模式-生产者/消费者文章目录异步模式-生产者/消费者1.概念2.代码实现生产者-消费者模式代码1.概念与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应;消费队列可以用来平衡生产和消费的线程资源;生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据;消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据;JDK 中各种阻塞队列,采用的就是这种模式;消息队列有延时,不会被立刻消费,异步的。2.代码实现生产者-消费原创 2021-10-19 14:19:41 · 115 阅读 · 0 评论 -
同步模式-保护性暂停
同步模式-保护性暂停文章目录同步模式-保护性暂停1.概念2.GuardedObject代码和测试代码3.扩展1-添加获取超时参数4.扩展2-多任务版GuardedObject5.join原理1.概念即 Guarded Suspension,用在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现原创 2021-10-19 14:15:28 · 220 阅读 · 0 评论 -
wait/notify
wait/notify文章目录wait/notify1.wait/notify工作原理2.wait/notiy API3.代码思考,体会使用sleep和wait/notify的区别4.wait()/notify() 虚假唤醒解决方法1.wait/notify工作原理Owner线程发现条件不满足,调用wait()方法,即可进入WaitSet变成WAITING状态。BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。BLOCKED线程会在Owner线程释放锁时唤醒。WAITI原创 2021-10-19 14:04:50 · 106 阅读 · 0 评论 -
Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)
Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)文章目录Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)1.轻量级锁2.锁膨胀3.自旋优化4.偏向锁4.1 对象头格式MarkWord4.2 偏向锁状态4.3 撤销-调用对象的hashCode方法4.4 撤销-其他线程使用对象4.5 撤销-调用wait/notify4.6 批量重偏向4.7批量撤销5.锁消除1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但是多线程的访问时间是错开的(也就是没有竞争原创 2021-10-15 08:37:06 · 231 阅读 · 0 评论 -
synchronized原理-Monitor
synchronized原理-Monitor文章目录synchronized原理-Monitor1.Java对象头2.Monitor结构3.Monitor过程分析1.Java对象头Integer: 8+4 字节int:4字节32位虚拟机下:对象头在32位虚拟机下是64位(8字节)Mark Word(32位):Klass Word(32位):决定对象的类型,通过该指针可以找到类对象。array length(32)—>数组长度对Normal来说:hashCode(25)—&g原创 2021-10-15 08:36:59 · 98 阅读 · 0 评论 -
几种线程安全单例实现的分析
几种线程安全单例实现的分析文章目录几种线程安全单例实现的分析1.介绍2.分析几种不同的实现,判断其线程安全性1.介绍单例模式有很多实现方法,饿汉、懒汉、静态内部类、枚举类,试分析每种实现下获取单例对象(即调用getInstance)时的线程安全,并思考注释中的问题。饿汉式:类加载就会导致该单实例对象被创建。懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建。2.分析几种不同的实现,判断其线程安全性实现1问题1:阻止子类继承该类,破坏了单例方法。问题2:创建对象原创 2021-10-15 08:36:51 · 68 阅读 · 0 评论 -
happens-before规则
happens-before规则文章目录happens-before规则1.介绍1.介绍happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见。线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见。线程对 volatile 变量的写,对接下来其它线程对该变量的读可见。线程启动(st原创 2021-10-15 08:36:44 · 81 阅读 · 0 评论 -
JMM-有序性
JMM-有序性文章目录JMM-有序性1.概念2.指令重排原理2.1 关于CPU的几个概念2.2 指令重排优化2.3 支持流水线的处理器2.4指令重排导致的问题3.volatile原理3.1如何保证可见性?3.2 如何保证有序性?4.double-checked locking 问题5.double-checked locking 解决方法1.概念JVM 会在不影响正确性的前提下,可以调整语句的执行顺序,思考下面一段代码。可以看到,至于是先执行 i 还是 先执行 j ,对最终的结果不会产生影响。所以原创 2021-10-15 08:36:35 · 531 阅读 · 0 评论 -
同步模式-Balking
同步模式-Balking文章目录同步模式-Balking1.介绍2.代码实现3.用来实现线程安全的单例1.介绍Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。2.代码实现package com.concurrent.p5;import lombok.extern.slf4j.Slf4j;import org.junit.Test;@Slf4j(topic = "c.SyncModel_Balking")publ原创 2021-10-15 08:36:27 · 167 阅读 · 0 评论 -
终止模式-两阶段终止模式
终止模式-两阶段终止模式文章目录终止模式-两阶段终止模式1. 介绍1.nterrupt实现2.volatile实现1. 介绍在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。1.nterrupt实现2.volatile实现package com.concurrent.p5;import lombok.extern.slf4j.Slf4j;import org.junit.Test;/** * 两阶段终止模式 */@Slf4j(to原创 2021-10-15 08:36:21 · 98 阅读 · 0 评论 -
JMM-可见性
JMM-可见性文章目录JMM-可见性1.概念2.可见性原因分析3.解决方法4.可见性和原子性区别1.概念当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。串行程序不存在可见性问题 。因为你在任何一个操作步骤中修改某个变量,那么在后续的步骤中,读取这个变量的值,一定是修改后的新值并行程序中如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个改动//共享变量可见性问题static boolean run = true;@Testpublic void t原创 2021-10-15 08:36:12 · 167 阅读 · 0 评论 -
Java内存模型JMM
Java内存模型JMM文章目录Java内存模型JMM1.概念2.主内存与工作内存3.数据类型存储4.内存之间的交互5.JMM 3大特性6.指令重排序1.概念资料引用:深入理解JMM原理Java内存模型(Java Memory Model,JMM)JMM规定了线程和内存之间的一些关系。系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对原创 2021-10-15 08:36:04 · 61 阅读 · 0 评论 -
unsafe
unsafe文章目录unsafe1.反射创建Unsafe对象2. Unsafe的CAS操作3.自己实现原子整数类1.反射创建Unsafe对象/** * Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用, * 只能通过反射获得 * private static final Unsafe theUnsafe; */@Testpublic void test_createUnsafeObj() throws NoSuchFieldException, Il原创 2021-10-14 09:33:32 · 75 阅读 · 0 评论 -
原子累加器
原子累加器文章目录原子累加器1.LongAdder比AtomicLong性能好的原因2.AtomicLong与LongAdder的比较代码3.LongAdder源码解析3.1 成员变量作用3.2 cas操作3.3Cell累加单元3.4@sun.misc.Contended 防止缓存行伪共享3.5 累加主要调用add方法3.6 longAccumulate方法源码分析(难)3.7 最后通过sum方法汇总1.LongAdder比AtomicLong性能好的原因性能提升的原因很简单,就是在有竞争时,设置多个原创 2021-10-14 09:31:07 · 217 阅读 · 0 评论 -
原子更新器
原子更新器文章目录原子更新器1.有哪些?2.例子1.有哪些?AtomicReferenceFieldUpdater // 域 字段AtomicIntegerFieldUpdaterAtomicLongFieldUpdater2.例子package com.concurrent.p7;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import java.util.concurrent.atomic.Atom原创 2021-10-14 09:24:54 · 74 阅读 · 0 评论 -
原子数组类
原子数组类文章目录原子数组类1.原子数组类有哪些?2.函数式接口说明3.演示1.原子数组类有哪些?AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray2.函数式接口说明supplier 提供者 无中生有 ()->结果function 函数 一个参数一个结果 (参数)->结果BiFunction 函数 两个参数一个结果 (参数1,参数2)->结果consumer 消费原创 2021-10-14 09:23:49 · 145 阅读 · 0 评论 -
ABA问题
ABA问题文章目录ABA问题1.AtomicInteger不能解决ABA问题2. AtomicStampedReference 时间戳原子引用3.AtomicMarkableReference1.AtomicInteger不能解决ABA问题主线程仅能判断出共享变量的值与最初值 A 是否相同,不能感知到这种从 A 改为 B 又 改回 A 的情况。/** * ABA问题复现 */@Testpublic void test_ABAQuestion() { AtomicInteger ai原创 2021-10-14 09:21:36 · 203 阅读 · 0 评论 -
原子引用类
原子引用类文章目录原子引用类1.原子引用类有哪些?2.应用-CAS安全实现账户取款操作1.原子引用类有哪些?AtomicReferenceAtomicMarkableReferenceAtomicStampedReference2.应用-CAS安全实现账户取款操作package com.concurrent.p7;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import java.math.BigDec原创 2021-10-14 09:18:38 · 197 阅读 · 0 评论 -
原子整数类
原子整数文章目录原子整数1.原子整数类有哪些?2.原子整数类的方法1.原子整数类有哪些?uc并发包提供了:AtomicBooleanAtomicIntegerAtomicLong2.原子整数类的方法AtomicInteger i = new AtomicInteger(0);// 获取并自增(i = 0, 结果 i = 1, 返回 0),类似于 i++System.out.println(i.getAndIncrement());// 自增并获取(i = 1, 结果原创 2021-10-14 09:15:55 · 239 阅读 · 0 评论 -
为什么无锁的效率高
为什么无锁的效率高文章目录为什么无锁的效率高1. CAS与synchronized 对比2.cas特点1. CAS与synchronized 对比优点:吞吐量高缺点:需要频繁使用cpu,资源开销大无锁情况下,即使重试失败,线程始终在高速运行,没有停歇synchronized 会让线程在没有获得锁的时候,发生上下文切换,进入阻塞打个比喻线程就好像高速跑道上的赛车,高速运行时,速度超快,一旦发生上下文切换,就好比赛车要减速、熄火,等被唤醒又得重新打火、启动、加速… 恢复到高速运原创 2021-10-14 09:13:02 · 169 阅读 · 0 评论 -
volatile
volatile文章目录volatile1.概念1.概念CAS操作需要volatile支持。源码上可以看出:获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。volatile 仅仅保证了共享变量的可见性,让其它线程能够看到最新值,但不能解决指令交错问题(不能原创 2021-10-14 09:09:22 · 48 阅读 · 0 评论 -
CAS(Compare And Swap比较并交换)
CAS(Compare And Swap比较并交换)文章目录CAS(Compare And Swap比较并交换)1.概念2.cas实现1.概念cas非常重要!CAS 操作包含三个操作数内存位置(V)预期原值(A)新值(B)CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。整个J.U.C都是建立在CAS之上的,因此对于synchronized阻塞算法,J.U.C原创 2021-10-14 09:06:08 · 95 阅读 · 0 评论 -
fork和join
fork和join文章目录fork和join1.概念2.使用3.改进1.概念Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。Fork/Jo原创 2021-10-10 19:48:16 · 173 阅读 · 0 评论 -
Tomcat线程池
Tomcat线程池文章目录Tomcat线程池1.组成2.源码3.Connector配置4.Executor配置1.组成#mermaid-svg-xdqBA02hQXNBCyQS .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-xdqBA02hQXNBCyQS .label text{fill:#333}#m原创 2021-10-10 19:48:07 · 261 阅读 · 0 评论 -
任务调度线程池
任务调度线程池文章目录任务调度线程池1.Timer、TimeTask的缺点2. 使用 ScheduledExecutorService替换Timer3. 正确处理执行任务异常4.应用-定时任务1.Timer、TimeTask的缺点在『任务调度线程池』功能加入之前,可以使用 java.util.Timer 来实现定时功能,Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。Tim原创 2021-10-10 19:47:59 · 210 阅读 · 0 评论 -
异步模式-工作线程
异步模式-工作线程文章目录异步模式-工作线程1.定义2.饥饿3.饥饿的解决方法4.创建多少线程池合适(1) CPU密集运算(2) I/O密集运算1.定义让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式。例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那么成本就太高了(对比另一种多线程设计模式:Thread-Per-Message)注意,不同任务原创 2021-10-09 18:29:52 · 229 阅读 · 0 评论 -
ThreadPoolExecutor线程池基本接口
ThreadPoolExecutor线程池基本接口文章目录ThreadPoolExecutor线程池基本接口1.介绍2. 线程池状态3. 构造方法4.newFixedThreadPool4.1 使用默认工厂的newFixedThreadPool4.2 自定义工厂的newFixedThreadPool5.newCachedThreadPool6.newSingleThreadExecutor7.提交任务8.关闭线程池1.介绍#mermaid-svg-BSUbBZF3WLq8468D .label{fon原创 2021-10-09 18:23:35 · 373 阅读 · 0 评论