csworkman

个人博客

CAS

2022-6-9 Mr Chang JUC

CAS 是靠硬件实现的从而在硬件层面提升效率,最底层还是交给CPU来保证原子性和可见性。实现方式是基于硬件平台的汇编指令,在intel的CPU中(X86机器),使用的是汇编指令cmpxchg指令。

核心思想就是:比较要更新变量的值V和预期值E(compare),相等才会将V的值设为新值N(swap)如果不相等自旋再来。


CAS两大缺点:
  1. 循环导致时间过长开销大
  2. ABA问题
    1654742119(1).jpg
    解决办法: 比较+版本号一致










































































评论(0) 浏览(948)

volatile——介绍

2022-6-7 Mr Chang JUC

  1. 特点:可见性,有序性
  2. 语义:
    当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量立即刷新回主内存中。
    当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,重新回到主内存中读取最新共享变量。

       内存屏障
1654583582(1).jpg
  1. 由于volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁来保证原子性
    运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
    变量不需要与其他的状态变量共同参与不变约束。

  2. 禁止重新排序的三种情况(重排序发生,会导致程序运行结果不同。)
    写后读————a=1; b=a; ————写一个变量之后在读这个变量
    写后写————a=1; a=2;———— 写一个变量之后,在写这个变量
    读后写————a=b;b=1;——————读一个变量之后,在写这个变量

评论(0) 浏览(942)

happens-before之8条

2022-6-7 Mr Chang JUC

  1. 次序规则
     一个线程内,  按照代码顺序,写在前面的操作线性发生于写在后面的操作;
  2. 锁定规则
    一个unLock操作先行发生于后面(这里的“后面”是指时间上的先后)对同一个锁的lock操作
  3. volatile变量规则
    对一个volatile变量的写操作先行发生于后面对这个变量的读操作。前面的写对后面的读是可见的。
  4. 传递规则
    如果操作A先行发生于操作B,操作B先行发生于操作C,则可以得出操作A先行发生于操作C
  5. 线程启动规则(Thread Start Rule)
    线程对象的start方法先行发生与线程里面的每一个操作。
  6. 线程中断规则(Thread interruption Rule
    先调用interrupt()方法设置过中断标志位,我才能检测到中断发送
  7. 线程终止规则(Thread Termination Rule
    线程中的所有操作都先行发生于对此线程的终止检测。可以通过isAlive()检测线程是否已经终止
  8. 对象终结规则(Finalizer Rule)
    一个对象的初始化构造函数完成 先行发生于它的finalize()方法的开始

评论(0) 浏览(892)

happens-before总原则

2022-6-7 Mr Chang JUC

  1. 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见。而且第一个操作的执行顺序排在第二个操作之前。
  2. 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。

评论(0) 浏览(879)

JMM ——Java Memory Model

2022-6-7 Mr Chang JUC

JMM(Java内存模型   Java Memory Model)本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。 


1、通过JMM来实现线程和主内存之间的抽象关系。
2、屏蔽各个硬件平台和操作及铜的内存访问差异以实现让java程序在各种平台下都能达到一致的内存访问结果。

评论(0) 浏览(882)

LockSupport

2022-6-7 Mr Chang JUC

1、LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根结底,LockSupport调用的Unsafe中的native代码。、
2、LockSupport 提供 park() 和 unpark()方法实现阻塞线程和解除线程阻塞的过程。

3、LockSupport和每个使用它的线程都有一个许可证(permit)

4、每个线程都有一个相关的permit,permit最多只有一个,重复调用unpark也不会累计凭证。




评论(0) 浏览(937)

中断机制之三大中断方法

2022-6-7 Mr Chang JUC

1、volatile



2、atomicBoolean




3、interrupt

评论(0) 浏览(842)

JAVA中如何排查死锁

2022-6-6 Mr Chang java

第一种方式  (纯命令):
     jps -l   列出当前java所有进程的pid
     jstack + 进程编号 查看运行的进程下面是否有死锁

第二种方式  (图形化)

     jconsole

评论(0) 浏览(785)

分布式系统概念

2022-5-12 Mr Chang Dubbo

评论(0) 浏览(797)

SpringBoot-Web开发

2022-3-31 Mr Chang springboot

  1. 创建SpringBoot应用,选中我们需要的模块
  2. SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置

评论(0) 浏览(868)