Java并发
文章平均质量分 76
Java并发
Peter Pan 1231
结硬寨 打呆仗 WebChat JianLong1231
展开
-
Java并发编程图册学习(六) 面试 volatile 关键字
对一个 volatile 域的写, happens-before 于任意后续对这个 volatile 域的读 一、happens-before 之 volatile 变量规则 JMM 针对编译器定制的 volatile 重排序的规则,那 JMM 是怎样禁止重排序的呢? 答案是内存屏障 二、内存屏障 (Memory Barriers / Fences) 为了实现 volatile 的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序 这句话有点抽象,..原创 2022-05-10 23:05:32 · 208 阅读 · 0 评论 -
Java并发编程图册学习(五) 解决原子性问题,首先需要宏观理解
目录 一、前言 二、锁 三、总结 一、前言 原子性问题的源头就是线程切换,但在多核 CPU的大背景下,不允许线程切换是不可能的 互斥: 同一时刻只有一个线程执行 上面这句话的意思是: 对共享变量的修改是互斥的,也就是说线程 A 修改共享变量时其他线程不能修改,这就不存在操作被打断的问题了 二、锁 synchronized 的三种用法: public class ThreeSync { private static final Object object = new Obj原创 2022-05-05 17:57:09 · 422 阅读 · 0 评论 -
Java并发编程图册学习(四) 有序性可⻅性 Happens-before
目录 一、前言 二、Happens-before 1. 程序顺序性规则 2. volatile变量规则 3. 传递性规则 4.监视器锁规则 5. start()规则 6. join()规则 三、总结 一、前言 1. 作为我们程序猿不想写出 bug 影响 KPI,所以希望内存模型易于理解、易于编程。这就需要基于一个强内存模型来编写代码 2. 作为编译器和处理器不想让外人说它处理速度很慢,所以希望内存模型对他们束缚越少越好,可以由他们擅自优化,这就需要基于一个弱内存模型 既然.原创 2022-05-05 17:23:06 · 127 阅读 · 0 评论 -
Java并发编程图册学习(三) 并发Bug之源有三,找对根源是关键
一、前言 作 为"资本家",你要尽可能的榨取 CPU,内存与 IO 的剩余价值,但三者完成任务的 速度相差很大,CPU > 内存 > IO分,CPU 是天,那内存就是地,内存是天,那 IO 就是地,那怎样平衡三者,提升整体速度呢? ...原创 2022-05-05 16:14:29 · 402 阅读 · 0 评论 -
Java并发编程图册学习(二) 透彻理解并发三个核心是关键
目录 一、并发编程可以抽象成三个核心问题 二、分工 三、同步/协作 四、互斥 五、总结 一、并发编程可以抽象成三个核心问题 分工 同步/协作 互斥 二、分工 将当前 Sprint 的 Story 拆分成「合适」大小的 Task,并且安排给「合适」的 Team Member 去完成 这里面用了两个「合适」,将 Story 拆分成大小适中,可完成的 Task 是非常重要的。拆分的粒度太粗,导致这个任务完成难度变高,耗时⻓,不易与其他人配合; 拆分的粒度太细,又导致任务太多,不好管原创 2022-04-26 17:05:01 · 220 阅读 · 0 评论 -
Java并发编程图册学习(一) 并发的世界很有趣
一、并发开胃菜 1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 2.假定工厂的电力有限,一次只能供给一个⻋间使用。也就是说,一个⻋间开工的时候,其他⻋间都必须停工。背后的含义就是,单个 CPU 一次只能运行一个任务。 3.进程就好比工厂的⻋间,它代表 CPU 所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 4.一个⻋间里,可以有很多工人。他们协同完成一个任务。 5.线程就好比⻋间里的工人。一个进程可以包括多个线程。 6.原创 2022-04-26 16:47:04 · 197 阅读 · 0 评论 -
JDK源码剖析- Java并发实现原理学习 (四) wait()与notify()
目录 一、生产者-消费者模型 二、为什么必须和synchronized一起使用 三、为什么wait()的时候必须释放锁 四、wait()与notify()的问题 一、生产者-消费者模型 生产者-消费者模型是一个常见的多线程编程模型。一个内存队列,多个生产者线程往内存队列中放数据;多个消费者线程从内存队列中取数据。 (1)内存队列本身要加锁,才能实现线程安全。 (2)阻塞。当内存队列满了,生产者放不进去时,会被阻塞; 当内存队列是空的时候,消费者无事可做,会被阻塞。 (3)双向通知。原创 2022-04-26 09:24:04 · 258 阅读 · 0 评论 -
JDK源码剖析- Java并发实现原理学习 (三) synchronized关键字
目录 一、锁的对象是什么 二、锁的本质是什么 三、Synchronized实现原理 一、锁的对象是什么 很容易误解 synchronized 关键字:它通常加在所有的静态成员函数和非静态成员函数的前面,表面看好像是“函数之间的互斥”,其实不是,synchronized关键字其实是“给某个对象加了把锁” 等价于 对于非静态成员函数,锁其实是加在对象a上面的; 对于静态成员函数,锁是加在A.class上面的。当然class本身也是对象 二、锁的本质是什么 多个线程要访问同一.原创 2022-04-26 08:56:53 · 193 阅读 · 0 评论 -
JDK源码剖析- Java并发实现原理学习 (二) InterruptedException与Interrupt函数
一、什么情况下会抛出Interrupted异常 Interrupt这个词很容易让人产生误解。从字面意思来看,好像是说一个线程运行到一半,把它中断了,然后抛出了InterruptedExcept ion异常,其实并不是。 这个时候,在主线程中调用一句t.interrupt(),请问该线程是否会抛出异常? 答案是不会。 假设这个线程阻塞在一个 synchronized 关键字 的地方,正准备拿锁,如下代码所示。 在主线程中调用一句t.interrupt(),请问该线程是否会抛出异常?.原创 2022-04-25 14:37:01 · 300 阅读 · 0 评论 -
JDK源码剖析- Java并发实现原理学习 (一) 线程的优雅关闭
一、stop()与destroy()函数 线程是“一段运行中的代码”,或者说是一个运行中的函数。既然是在运行中,就存在一个最基本的问题: 运行到一半的线程能否强制杀死? 答案肯定是不能。在Java中,有stop()、destory()之类的函数,但这些函数都是官方明确不建议使用的。原因很简单,如果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等不 能正常关闭。 一个线程一旦运行起来,就不要去强行打断它,合理的关闭办法是让其运行完(也就是函数执行完毕),干净地释放掉所有资源,然后退.原创 2022-04-25 11:12:19 · 287 阅读 · 0 评论