多线程
文章平均质量分 86
summer_west_fish
本科毕业深圳大学,拥有Java开发10年的经验。 拥有Devops、敏捷和项目管理多年的经验,并且获得PMP、ACP和DOP等相关证书。
展开
-
用户态和内核态
在说用户态与内核态之前,有必要说一下 ,指令集是 CPU 实现软件指挥硬件执行的媒介,具体来说每一条汇编语句都对应了一条 ,而非常非常多的 在一起,可以组成一个、甚至多个集合,指令的集合叫 。同时 有权限分级,大家试想, 可以直接操作硬件的,要是因为指令操作的不规范`,造成的错误会影响整个计算机系统的。好比你写程序,因为对硬件操作不熟悉,导致操作系统内核、及其他所有正在运行的程序,都可能会因为操作失误而受到不可挽回的错误,最后只能重启计算机才行。而对于硬件的操作是非常复杂的,参数众多,出问题的几率相当大原创 2022-06-21 14:22:17 · 193 阅读 · 0 评论 -
异构交易场景交互流程及一致性保证
A 系统联机同步调用 B 系统(A 和 B 不是同一公司系统,不能用分布式事务),如何保证系统间数据准实时一致性(聊聊设计思路即可)?提醒:需要考虑调用超时、并发、幂等、反交易先到等。各种异常场景怎么处理要考虑更完善些,如事务隔离、并发、反交易先到调用方和服务方约定(前端客户不可能一直等着)这种聊思路的问题,往往问的都很大,或者说比较唬人,实际上遇到这种问题,我们要做的就是抽象。抽象出场景,抽象出问题的核心要点。我们能够提炼出要点:有了这些前提,我们就可以基本抽象出讨论的背景和模型。因为前提是 A、B 系统转载 2022-06-16 10:10:39 · 804 阅读 · 1 评论 -
AQS实现原理
AQS中维护了一个volatile int state(共享资源)和一个CLH队列。当state=1时代表当前对象锁已经被占用,其他线程来加锁时则会失败,失败的线程被放入一个FIFO的等待队列中,然后会被UNSAFE.park()操作挂起,等待已经获得锁的线程释放锁才能被唤醒。我们拿具体场景来分析,假设同时有三个线程并发抢占锁,此时线程一抢占成功,线程二、三抢占失败,具体流程如下:此时AQS内部数据结构为:上图可以看到等待队列中的节点Node是一个双向链表,这里SIGNAL是No..转载 2021-09-03 14:12:20 · 5062 阅读 · 3 评论 -
CAS原理
一、核心思想CAS 涉及到以下操作:假设内存中的原数据V,旧的预期值A,需要修改的新值B。1、比较 A 与 V 是否相等。(比较)2、如果比较相等,将 B 写入 V。(交换)3、返回操作是否成功二、CAS基础实现CAS 是 compare and swap 的简写,即比较并交换。它是指一种操作机制,而不是某个具体的类或方法。在 Java 平台上对这种操作进行了包装。在 Unsafe 类中,调用代码如下:unsafe.compareAndSwapInt(this,.原创 2022-05-26 14:13:10 · 4041 阅读 · 0 评论 -
Synchronized原理
互斥锁:当一个共享数据被当前正在访问到线程添加了互斥锁之后,在同一时刻,其他线程只能等待,直到当前线程释放该锁。在多线程使用共享资源的时候, 我们可以使用synchronized来锁定共享资源。synchronized可以添加互斥锁,并且保证被其他线程看到。一、synchronized的三种应用方式synchronized关键字最主要有以下3种应用方式,下面分别介绍:修饰实例方法,作用于当前实例加锁,进入同步代码钱要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要原创 2022-05-24 16:47:23 · 210 阅读 · 0 评论 -
Monitor与重量级锁
轻量级锁和偏向锁是Java 6对synchronized锁进行优化后新增加的。重量级锁就是通常说的synchronized的对象锁,锁标识位10,其中指针指向的时monitor对象的起始地址(也称为管程或监视器锁)。每个对象都存在着一个monitor与之关联,对象与其monitor之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个monitor被某个线程持有后,它便处于锁定状态。在Java虚拟机(HotSpot)中,monitor是原创 2022-05-24 15:26:55 · 413 阅读 · 0 评论 -
Java对象头
一、概述在 JVM 中,对象在堆内存中的布局分为三块区域:对象头、实例变量和填充数据。对象头区域Java对象的对象头由 mark word 和 class pointer 两部分组成。对象自身的运行时数据(MarkWord)。存储 hashcode、GC 分代年龄、锁类型标记、偏向锁线程 ID、CAS 锁指向线程 LockRecord 的指针等,synchronized 锁的机制与这个部分(markwork)密切相关,用 markword 中最低的三位代表锁的状态,其中一位是偏向锁位,原创 2022-05-24 14:44:42 · 1821 阅读 · 0 评论 -
Java指令重排
什么是重排序?为了提高性能,在遵守 as-if-serial 语义(即不管怎么重排序,单线程下程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵守。)的情况下,编译器和处理器常常会对指令做重排序。一般重排序可以分为如下三种类型:编译器优化重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 指令级并行重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 内存系统重排序。由于处理.原创 2022-05-23 17:00:28 · 3050 阅读 · 0 评论 -
volatile关键字
使用 volatile 修饰共享变量后,每个线程要操作变量时会从主内存中将变量拷贝到本地内存作为副本,当线程操作变量副本并写回主内存后,会通过 CPU 总线嗅探机制告知其他线程该变量副本已经失效,需要重新从主内存中读取。volatile 保证了不同线程对共享变量操作的可见性,也就是说一个线程修改了 volatile 修饰的变量,当修改后的变量写回主内存时,其他线程能立即看到最新值。接下来我们就聊聊一个比较底层的知识点:总线嗅探机制。总线嗅探机制在现代计算机中,CPU 的速度是极高的,如.原创 2022-05-23 16:26:31 · 377 阅读 · 0 评论 -
Java内存模型
现代CPU构造原创 2022-05-23 15:06:48 · 121 阅读 · 0 评论 -
克雷格.兰丁&hagersten (CLH Lock)
CLH LockCLH Lock摘要Java代码实现简单的看一下CLH的算法定义测试CLHLock小结CLH Lock摘要CLH lock is Craig, Landin, and Hagersten (CLH) locks, CLH lock is a spin lock, can ensure no hunger, provide fairness first come first service.The CLH lock is a scalable, high performance, fai原创 2020-09-05 15:01:21 · 401 阅读 · 0 评论 -
Java线程起源
第一阶段其实早期的时候,操作系统是没有线程的概念,线程是后面加进来的,操作系统刚开始只有进程,操作系统分配资源的最小单位是进程,进程与进程之间相关隔离,每个进程有自己的内存空间,文件描述符,CPU 调度以进程作为最小调度单元;第二阶段初期的多线程,线程是在用户空间下实现的。什么意思?我们都知道内存分用户空间和系统空间,系统空间是给操作系统使用的,用户空间是应用程序使用的,应用程序如果需要访问系统空间,需要进行系统调用,从用户态切换到内核态。那怎么在用户空间实现的多线程呢?实际上是操作系统按进程原创 2021-04-17 00:30:55 · 198 阅读 · 0 评论 -
Java线程与内核线程状态关系
Java线程与Kernel欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用原创 2020-08-25 13:52:14 · 539 阅读 · 0 评论 -
深入Java Thread底层实现
这里写目录标题java.lang.Thread # start()Thread.cthread.cpp # JavaThread::JavaThread()os_linux.cpp # os::create_thread()os_linux.cpp # *thread_native_entry()thread.cpp # Thread::start()os.cpp # os::start_thread()os_linux.cpp # os::pd_start_thread()thread.cpp # Jav原创 2020-09-04 17:50:07 · 1072 阅读 · 1 评论 -
Java线程和OS线程
Java线程和OS线程操作系统实现线程有三种方式内核线程实现用户线程实现用户线程实现操作系统实现线程有三种方式内核线程实现用户线程实现用户线程加轻量级进程混合实现内核线程实现简要说明:内核线程(Kernel-Level Thread简称KLT)是直接由操作系统内核直接支持的线程,这种线程由内核完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力处理多件事情,这种支持多线程的内核就叫做多线程内核原创 2020-08-27 16:28:07 · 588 阅读 · 0 评论