java多线程
文章平均质量分 79
褚念荣
科学研究的基本逻辑 ——发现问题、分析问题、提出问题、解决问题以及持续改进
展开
-
浅谈偏向锁、轻量级锁、重量级锁
为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。内置锁的分配和膨胀过程较为复杂,限于时间和精力,文中该部分内容是根据网上的多方资料整合而来;仅为方便查阅,后面继续分析JVM源码的时候也有个参考。如果对各级锁已经有了基本了解,读者大可跳过此文。转载 2022-11-04 11:52:20 · 107 阅读 · 0 评论 -
Java Synchronised机制
JDK6引入偏向锁(首次需要通过CAS修改对象头中的Mark Word,之后该线程再进入只需要比较对象头中的Mark Word的Thread ID是否与当前的一致,如果一致说明已经取得锁,就不用再CAS了)。: 引入锁削除(虚拟机即时编译器(JIT)运行时,依据逃逸分析的数据检测到不可能存在竞争的锁,就自动将该锁消除)。: 引入锁膨胀(会自动将锁的范围拓展到操作序列(如循环)外, 可以理解为将一些反复的锁合为一个锁放在它们外部)。锁升级是单向的: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。转载 2022-11-04 10:36:38 · 108 阅读 · 0 评论 -
CountDownLatch
的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。注意:java中还有一个同步工具类叫做,他的作用和CountDownLatch类似。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都必须要加载到100%才可以进入。否则所有玩家都相互等待。原创 2022-11-04 10:03:42 · 66 阅读 · 0 评论 -
既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
因此,MESI协议最多只是保证了对于一个变量,在多个核上的读写顺序,对于多个变量而言是没有任何保证的。很遗憾,还是需要volatile~~因为 MESI只是保证了多核cpu的独占cache之间的一致性。首先,volatile是java语言层面给出的保证,但是cpu的并不是直接把数据写入L1 cache的。原创 2022-11-03 12:32:34 · 205 阅读 · 0 评论 -
缓存一致性协议之MESI
在上图中,Local Read表示本内核读本Cache中的值,Local Write表示本内核写本Cache中的值,Remote Read表示其它内核读其它Cache中的值,Remote Write表示其它内核写其它Cache中的值,箭头表示本Cache line状态的迁移,环形箭头表示状态不变。M(Modified)和E(Exclusive)状态的Cache line,数据是独有的,不同点在于M状态的数据是dirty的(和内存的不一致),E状态的数据是clean的(和内存的一致)。转载 2022-11-03 11:19:35 · 198 阅读 · 0 评论 -
深入理解sun.misc.Unsafe原理
Unsafe类在JDK源码中被广泛使用,在Spark使用off-heap memory时也会使用到,该类功能很强大,涉及到类加载机制(深入理解ClassLoader工作机制),其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是系统加载初始化就会抛出SecurityException异常。这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率。但是,它是一把双刃剑:正如它的名字所预示的那样,它是Unsafe的,它所分配的内存需要手动free(不被GC回收)。转载 2022-10-25 14:02:26 · 510 阅读 · 0 评论 -
java线程安全详解
线程问题一、什么是线程安全问题?1.什么是线程安全问题?刚听到这个词大脑一篇空白,内心n个问号。按照惯例我查了百度,百度百科是这样解释的线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。为了能直观展示多线程安全问题,我模拟了多窗口卖票场景(假如某演唱会剩余5张票,有A、B、C、D四个窗口同时售票场景)模拟卖票窗口类:package spittr.test;原创 2020-08-12 21:38:19 · 1802 阅读 · 0 评论