jvm/juc
bwylco_
故事还长,请别失望
展开
-
【JUC】什么是ABA问题?
前言从AtomicInteger引出下面的问题CAS -> Unsafe -> CAS底层思想 -> ABA -> 原子引用更新 -> 如何规避ABA问题ABA问题是什么一句话概括就是:狸猫换太子假设现在有两个线程,分别是T1 和 T2,然后T1执行某个操作的时间为10秒,T2执行某个时间的操作是2秒,最开始AB两个线程,分别从主内存中获取A值,但是因为B的执行速度更快,他先把A的值改成B,然后在修改成A,然后执行完毕,T1线程在10秒后,执行完毕,判断内存中的值转载 2020-10-29 15:51:29 · 1183 阅读 · 0 评论 -
【JUC】什么是CAS?
前言CAS的全称是Compare-And-Swap,它是CPU并发原语它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中转载 2020-10-29 15:45:42 · 216 阅读 · 0 评论 -
【JUC】Volatile的应用:Volatile控制懒汉单例并发问题(与synchronized比较)
单例模式(懒汉)单线程下的单例模式代码/** * SingletonDemo(单例模式) */public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + "\t 我是构造方法SingletonDemo");转载 2020-10-29 15:36:12 · 160 阅读 · 0 评论 -
【JUC】Volatile为什么不保证原子性
前言(关于可见性)通过前面对JMM的介绍,我们知道,各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。这就可能存在一个线程AAA修改了共享变量X的值,但是还未写入主内存时,另外一个线程BBB又对主内存中同一共享变量X进行操作,但此时A线程工作内存中共享变量X对线程B来说是不可见,这种工作内存与主内存同步延迟现象就造成了可见性问题。原子性不可分割,完整性,也就是说某个线程正在做某个具体业务时,中间不可以被加塞或者被分割,需要具体完成,要么同时成功,要么同转载 2020-10-29 15:25:59 · 180 阅读 · 0 评论 -
【JUC】Volatile和JMM内存模型的可见性
谈谈对Volatile的理解Volatile在日常的单线程环境是应用不到的 Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 JMM是什么JMM是Java内存模型,也就是Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式JMM.转载 2020-10-29 15:11:59 · 111 阅读 · 0 评论 -
【JUC】Volatile禁止指令重排
计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种:源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行指令单线程环境里面确保最终执行结果和代码顺序的结果一致处理器在进行重排序时,必须要考虑指令之间的数据依赖性多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。指令重排 - example 1public void mySort() {.转载 2020-10-29 15:04:03 · 170 阅读 · 0 评论