Java并发原理
文章平均质量分 88
fortmie
这个作者很懒,什么都没留下…
展开
-
Java并发原理(八)——JVM锁优化
目录JVM锁的优化自旋锁自适应自旋锁锁消除偏向锁轻量级锁锁的优缺点对比Synchronized与Lock如何解决死锁?JVM锁的优化简单来说在JVM中monitorenter和monitorexit字节码依赖于底层的操作系统的Mutex Lock来实现的,但是由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行,这种切换的代价是非常昂贵的;然而在现实中的大部分情况下,同步方法是运行在单线程环境(无锁竞争环境)如果每次都调用Mutex Lock原创 2021-07-07 02:42:26 · 107 阅读 · 0 评论 -
Java并发原理(七)——Synchronized详解
Synchronized的使用在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁对象是*.class以及synchronized修饰的是sta原创 2021-07-07 02:33:05 · 153 阅读 · 0 评论 -
Java并发原理(六)——JUC原子类:CAS及原子类
什么是CASCAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。 简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不..原创 2021-07-07 02:23:39 · 165 阅读 · 0 评论 -
Java并发原理(五)——volatile作用详解
目录保证有序性实现可见性保证原子性:单次读/写保证有序性Volatile保证有序性(禁止指令重排序优化,jkd1.5以后重新修复):先行先发生原则中volatile变量规则:对一个volatile变量的写操作先行发生于(能被后面的读操作感知到)后面(时间上)对这个变量的读操作。通过内存屏障(Memory Barrier)实现,指令重排序时不能把后面的指令重排序到内存屏障之前的位置。从一个最经典的例子来分析重排序问题。在并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的原创 2021-07-07 02:11:25 · 65 阅读 · 0 评论 -
Java并发原理(四)——Java内存模型
概述由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中没这样处理器就无需等待缓慢的内存读写了。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和原创 2021-07-07 01:58:03 · 54 阅读 · 0 评论 -
Java并发原理(三)——线程的实现与调度
线程的实现内核线程(KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换。程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口—轻量级进程(LWP),轻量级进程就是我们通常意义上所讲的线程,每个轻量级进程都是由一个内核线程支持(关系为1:1);对于Sun JDK来说,它的Window版与Linux版都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程中。Java线程调度一般线程调度模式分为两种——抢占式调度和协同式调度(非抢占式)。抢占式调度(原创 2021-07-07 01:51:12 · 106 阅读 · 0 评论 -
Java并发原理(二)——线程基础
目录线程状态转换线程中断线程使用方式线程状态转换新建(New)创建后尚未启动。可运行(Runnable)可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。阻塞(Blocking)等待获取一个排它锁,如果其线程释放了锁就会结束此状态。无限期等待(Waiting)等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。进入方法 退出方法 没有设置 Timeout 参数的 Object.w原创 2021-07-07 01:49:41 · 66 阅读 · 0 评论 -
Java并发原理(一)——并发问题来源
目录为什么需要多线程并发三要素this逃逸为什么需要多线程众所周知,CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为: CPU 增加了缓存,以均衡与内存的速度差异;// 导致 可见性问题 操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;// 导致 原子性问题 编译程序优化指令执行次序,使得缓存能够得到更...原创 2021-07-07 01:45:33 · 78 阅读 · 0 评论