
Java线程&JMM
文章平均质量分 96
专门介绍Java线程
爱吃牛肉的大老虎
学无止境,既要有深度又要有广度地学习
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java多线程之StampedLock讲解
锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不允许另外的线程对共享变量进行写操作,更多的适合于读多写少的环境中。那么,在读多写少的环境中,有没有一种比更快的锁呢?答案当然是有!那就是——JDK1.8中新增的与相比,在读的过程中也允许后面的一个线程获取写锁对共享变量进行写操作,为了避免读取的数据不一致,使用读取共享变量时,需要对共享变量进行是否有写入的检验操作,并且这种读是一种乐观读。总之,是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读。原创 2025-03-18 11:14:30 · 939 阅读 · 1 评论 -
JDK19特性之虚拟线程
在读《深入理解JVM虚拟机》这本书前两章的时候整理了JDK从1.0到最新版本发展史,其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性,在调研JDK19新增特性的时候了解到了虚拟线程这个概念,于是对虚拟线程进行学习整理内容如下。虚拟线程(Virtual Threads)就犹如名字一样,并非传统意义上的JAVA线程。传统意义上的JAVA线程(以下称为平台线程)跟操作系统的内核线程是一一映射的关系(如下图所示)。而对于平台线程的创建和销毁所带来的开销是非常大的,所以JAVA采用线程池。转载 2023-10-10 09:49:48 · 389 阅读 · 0 评论 -
Java多线程之ExecutorCompletionService
当我们向Executor提交一组任务,并且希望任务在完成后获得结果,此时可以考虑使用。实现了接口。将Executor和功能融合在一起,使用它可以提交我们的Callable任务。这个任务委托给Executor执行,可以使用对象的take和poll方法获取结果。的设计目的在于提供一个可获取线程池执行结果的功能,这个类采用了装饰器模式,需要用户提供一个自定义的线程池,在内部持有该线程池进行线程执行,在原有的线程池功能基础上装饰额外的功能。相比之前Future。原创 2023-03-22 23:09:52 · 1911 阅读 · 0 评论 -
Thread.sleep(0)深入分析
因为我们知道,Java 程序员来说,虚拟机有自己的 GC 机制,我们不需要像写 C 或者 C++ 那样得自己管理内存,只要关注于业务代码即可,并没有特别注意 GC 机制。有了安全点的设定,也就决定了用户程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。虚拟机为了避免安全点过多带来过重的负担,对循环还有一项优化措施,认为循环次数较少的话,执行时间应该也不会太长,所以使用。线程可能正处于框起来的五种不同的状态,针对不同的状态有不同的处理方案。转载 2022-09-09 18:07:58 · 3067 阅读 · 1 评论 -
CPU模型,内存分页与调优,内核与用户空间
我们知道,CPU是通过寻址来访问内存的。32位CPU的寻址宽度是,计算后得到的大小是4G,也就是说可支持的物理内存最大是4G。但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。为了解决此类问题,现代CPU引入了MMU(内存管理单元)MMU的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由MMU负责将虚址映射为物理地址。MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。内存分页(Paging)是在使用和。...原创 2022-07-24 18:33:40 · 1717 阅读 · 0 评论 -
Java多线程之CompletableFuture
文章目录1 CompletableFuture1.1 简介1.2 创建CompletableFuture1.2.1 构造函数创建1.2.2 supplyAsync创建1.2.3 runAsync创建1.3 异步回调方法1.3.1 thenApply / thenAccept / thenRun互相依赖1.3.1.1 thenApply1.3.1.2 thenAccept / thenRun1.3.2 exceptionally有返回1.3.3 whenComplete无返回1.3.4 handle有返回1.转载 2022-04-28 21:13:54 · 27286 阅读 · 2 评论 -
Java多线程之线程池深入讲解
文章目录1 线程池介绍1.1 线程池概念1.2 线程池好处2 线程池的使用2.1 线程池的创建2.1.1 通过ThreadPoolExecutor创建2.1.2 通过Executors方式创建2.2 线程池提交的返回值2.2.1 无返回值2.2.1.1 execute提交2.2.1.2 实现Runnable接口2.2.2 有返回值2.2.2.1 submit提交2.2.2.2 实现Callable接口2.2.3 使用例子2.3 线程池的关闭3 线程池的分析3.1 流程分析3.2 源码分析4 合理的配置线程池原创 2021-12-27 08:48:29 · 1588 阅读 · 1 评论 -
Java多线程之生产者和消费者模型
文章目录1 多线程中生产者和消费者1.1 为什么要使用生产者和消费者模式1.2 什么是生产者消费者模式1.3 实际操作1 多线程中生产者和消费者在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。1.1 为什么要使用生产者和消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的转载 2021-12-26 17:21:27 · 868 阅读 · 0 评论 -
Java多线程之Fork/Join框架和障碍器
文章目录1 Fork/Join框架1.1 什么是Fork/Join框架1.2 工作窃取算法1.3 Fork/Join框架的介绍1.4 使用Fork/Join框架1.5 Fork/Join框架的异常处理1.6 Fork/Join框架的实现原理2 障碍器2.1 CyclicBarrier2.1.1 CyclicBarrier概念2.1.2 方法2.1.2.1 构造方法2.1.2.2 await方法2.1.3 使用CyclicBarrier2.1.4 CyclicBarrier与CountDownLatch区别2原创 2021-12-26 15:01:27 · 399 阅读 · 0 评论 -
Java多线程之线程状态和关键字讲解
文章目录1 原子操作1.1 引言1.2 术语定义1.3 处理器如何实现原子操作1.3.1 处理器自动保证基本内存操作的原子性1.3.2 使用总线锁保证原子性1.3.3 使用缓存锁保证原子性1.4 JAVA如何实现原子操作1.4.1 使用循环CAS实现原子操作1.4.2 使用锁机制实现原子操作1 原子操作1.1 引言原子(atom)本意是不能被进一步分割的最小粒子,而原子操作(atomic operation)意为不可被中断的一个或一系列操作 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊原创 2021-12-25 17:56:56 · 1165 阅读 · 0 评论 -
Java多线程之Lock深入理解
文章目录1 Lock原理深入理解1.1 synchronized的缺陷1.2 java.util.concurrent.locks包下常用的类1.2.1 Lock接口1.2.1.1 lock方法1.2.1.2 tryLock方法1.2.1.3 lockInterruptibly方法1.2.1.4 newCondition方法1.2.2 ReentrantLock1.2.2.1 可重入锁概念1.2.2.2 ReentrantLock使用1.2.2.2.1 lock用法1.2.2.2.2 tryLock用法1.原创 2021-12-25 10:13:38 · 2084 阅读 · 1 评论 -
Java多线程之Synchronized深入理解
文章目录1 Synchronized1.1 引言1.2 概念理解1.2.1 不同锁对象1.2.2 对象锁和类锁概念区别1.2.3 同步概念1.2.4 Synchronized概念1.3 原理1.3.1 Synchronized实现原理1.3.2 Java对象头1.4 实际操作1.4.1 对象锁1.4.1.1 使用同一对象锁1.4.1.2 使用不同对象锁1.4.4.3 Synchronized块1.4.2 类锁1 Synchronized1.1 引言在多线程并发编程中Synchronized一直是元老级原创 2021-12-07 21:57:52 · 2155 阅读 · 0 评论 -
Java中Java对象结构和各种类型锁的理解
文章目录1 Java对象结构1.1 对象结构概述1.2 对象头1.3 实例数据1.4 对齐填充1.5 对象大小计算1.6 HotSpot对象模型2 Java中锁类型2.1 锁基础理解2.1.1 锁类型2.1.1.1 乐观锁2.1.1.2 悲观锁2.1.2 java线程阻塞的代价2.1.3 markword2.2 Java中锁2.2.1 偏向锁2.2.1.1 概念2.2.1.2 偏向锁的实现2.2.1.3 偏向锁的适用场景2.2.1.4 查看停顿–安全点停顿日志2.2.1.5 jvm开启/关闭偏向锁2.2.2原创 2021-12-05 12:18:15 · 1281 阅读 · 0 评论 -
深入理解JMM之锁,final,总结
文章目录1 JMM1.1 锁1.1.1 锁的释放-获取建立的happens-before 关系1.1.2 锁释放和获取的内存语义1.1.3 锁内存语义的实现1.1.3.1 ReentrantLock公平锁1.1.3.2 ReentrantLock非公平锁1.1.4 concurrent包的实现1.2 final1.2.1 写final域的重排序规则1.2.2 读final域的重排序规则1.2.3 引用类型的final域1.2.4 为什么final引用不能从构造函数内“逸出”1.2.5 final语义在处理器原创 2021-11-21 11:01:09 · 871 阅读 · 0 评论 -
深入理解JMM之并发模型,重排序规则,顺序一致性
文章目录1 JMM1.1 并发编程模型1.1.1 并发编程模型分类1.1.2 Java内存模型抽象1.1.3 重排序1.1.4 处理器重排序与内存屏障指令1.1.5 happens-before1.2 重排序1.2.1 数据依赖性1.2.2 as-if-serial语义1.2.3 程序顺序规则1.2.4 重排序对多线程的影响1.3 顺序一致性1.3.1 数据竞争与顺序一致性保证1.3.2 顺序一致性内存模型1.3.3 同步程序的顺序一致性效果1.3.4 未同步程序的执行特性1.4 volatile的特性1.原创 2021-11-21 11:00:46 · 405 阅读 · 0 评论 -
Java多线程之CAS原理和原子操作
文章目录1 CAS1.1 CAS应用分析1.2 CAS原理1.3 CPU锁分类1.3.1 处理器自动保证基本内存操作的原子性1.3.2 使用总线锁保证原子性1 CAS1.1 CAS应用分析CAS:Compare and Swap, 翻译成比较并交换。java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。本文先从CAS的应用说起,再深入原理解析。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内转载 2021-11-19 13:24:55 · 533 阅读 · 0 评论 -
java中共享变量分析和volatile
文章目录1 共享变量理解1 共享变量理解Java并发一直都是开发中比较难也比较有挑战性的技术,对于很多新手来说是很容易掉进这个并发陷阱的,其中尤以共享变量最具代表性,其实关于讲这个知识点网上也不少,但是想讲讲自己对这个概念的理解。共享变量比较典型的就是指类成员变量,在类中定义了很多方法对成员变量的使用,如果是单实例,当有多个线程同时来调用这些方法,方法又没加控制,那么这些方法对成员变量的操作就会使得该成员变量的值变得不准确了。用一个最典型的i++例子来说明:public class Test {原创 2020-12-01 10:29:18 · 2207 阅读 · 0 评论 -
java内存模型(JMM)详解
文章目录1 JMM1.1 问题引入1.1.1 为什么要有内存模型1.1.1.1 CPU1.1.1.2 CPU Register1.1.1.3 CPU Cache Memory1.1.1.4 Main Memory转载于:https://mp.weixin.qq.com/s/EhIJpxRUb26KCJqpFbBCrA1 JMM1.1 问题引入1.1.1 为什么要有内存模型要想回答这个问题,我们需要先弄懂传统计算机硬件内存架构。好了,要开始画图了硬件内存架构图1.1.1.1 CPU去过机房的转载 2021-05-23 11:10:54 · 1382 阅读 · 0 评论 -
ThreadLocal,InheritableThreadLocal,TransmittableThreadLocal
文章目录1 ThreadLocal1.1 基本理解1.2 应用1.2.1 使用场景1.2.2 在 Spring 中的使用->解决线程安全问题1.3 原理1.3.1 ThreadLocal的结构1.3.2 ThreadLocal 的方法1.3.3 ThreadLocal的内部类ThreadLocalMap1.4 总结1 ThreadLocal1.1 基本理解ThreadLocal 是......转载 2020-03-20 21:12:58 · 1904 阅读 · 3 评论 -
java实现线程的三种方式, stop()和suspend()方法为何不推荐使用
文章目录1 线程的实现1.1 基础Thread类1.2 实现Runnable类1.3 线程池写法2 stop和suspend方法1 线程的实现java5以前,有如下两种:有两种实现方法,分别使用new Thread()和newThread(runnable)形式,第一种直接调用thread的run方法,所以,我们往往使用Thread子类,即new SubThread()。第二种调用runna...原创 2020-01-07 15:16:49 · 957 阅读 · 0 评论 -
Java多线程之volatile关键字,happens-before
文章目录1 volatile1.1 理解1.2 缓存1 volatile1.1 理解Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。之所以要单独提出volatile这个不常用的关键字原因是这个关键字在高性能的多线程程序...原创 2020-01-08 20:01:01 · 654 阅读 · 0 评论