juc
文章平均质量分 64
互联网三高
高性能
高可用
高拓展
pmc0_0
想做一个优秀的Java后端开发工程师
展开
-
原子类Atomic
文章目录简介原子整数AtomicInteger相关API原子引用 简介 该类的实例操作能保证原子性,多个线程下可以保证线程安全 原子整数AtomicInteger相关API public class Test15 { public static void main(String[] args) { AtomicInteger i = new AtomicInteger(2); System.out.println(i.incrementAndGet())原创 2022-06-14 22:10:00 · 89 阅读 · 0 评论 -
无锁并发-CAS机制
文章目录示例代码volatile无锁的效率CAS特点 示例代码 package thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * @author pangjian * @Interface Account * @Description 比较线程不安全,无锁安全并发和有锁安全并发 * @date 2021/11/4 12原创 2021-11-04 17:51:34 · 227 阅读 · 0 评论 -
JMM-有序性
文章目录无序性指令级并行解决办法问题解决问题happens-before 无序性 JVM 会在不影响正确性的前提下,可以调整语句的执行顺序 // 这两行代码执行顺序是不一定的,可能先对j赋值 i = ...; j = ...; 指令级并行 示例代码 /** * @author pangjian * @ClassName ConcurrencyTest * @Description 并发测试 * @date 2021/11/3 14:10 */ @JCStressTest // 标记原创 2021-11-04 11:09:56 · 310 阅读 · 0 评论 -
JMM-可见性
文章目录Java内存模型代码解读volatile(易变关键字)synchronized区别 Java内存模型 JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面: 原子性 - 保证指令不会受到线程上下文切换的影响 可见性 - 保证指令不会受 cpu 缓存的影响 有序性 - 保证指令不会受 cpu 指令并行优化的影响 代码解读 @Slf4j public class Test09原创 2021-11-03 13:57:40 · 136 阅读 · 0 评论 -
ReentrantLock
文章目录特性基本语法可重入可打断锁超时哲学家问题条件变量 特性 相对于 synchronized 它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量 基本语法 reentrantLock.lock(); try { // 临界区代码 } finally { // 释放锁 reentrantLock.unlock(); } 可重入 可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁,如果是不可重入锁,那么原创 2021-11-03 12:08:57 · 97 阅读 · 0 评论 -
活锁LiveLock
文章目录活锁代码区别解决方法 活锁代码 @Slf4j public class LiveLock { static volatile int count = 10; static final Object object = new Object(); public static void main(String[] args) { new Thread(() -> { while (count > 0) {原创 2021-11-02 13:30:34 · 146 阅读 · 0 评论 -
Park & Unpark
文章目录基本使用与 Object 的 wait & notify 相比底层原理 基本使用 // 暂停当前调用者线程 LockSupport.park(); // 恢复某一个线程的运行 LockSupport.unpark(暂停线程对象); @Slf4j public class Test04 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thre原创 2021-11-02 12:09:16 · 168 阅读 · 0 评论 -
wait/notify理解
文章目录wait/notify底层相关APIsleep(long n)和wait(long n)区别虚假唤醒 wait/notify底层 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,原创 2021-11-02 10:49:59 · 129 阅读 · 0 评论 -
偏向锁原理
文章目录简介偏向锁加锁原理撤销偏向调用hashCode方法其他线程使用对象调用wait/notify 简介 一个线程反复的去获取/释放一个锁,如果这个锁是轻量级锁或者重量级锁,不断的加解锁显然是没有必要的,轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行CAS操作。Java 6中引入了偏向锁来做进一步优化,只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。以后只要不发生竞争,这个对象就归该线程所有 偏向锁主要用来优化同原创 2021-11-01 20:18:06 · 351 阅读 · 0 评论 -
轻量级锁原理
文章目录示例代码原理加锁成功原理cas失败和解锁原理锁膨胀自旋优化 示例代码 /** * @author pangjian * @ClassName LightWeightLocking * @Description 轻量级锁加锁解锁过程示例代码 * @date 2021/11/1 10:55 */ public class LightWeightLocking { static final Object obj = new Object(); public static v原创 2021-11-01 11:50:33 · 279 阅读 · 0 评论 -
重量级锁-Monitor
文章目录Java对象头工作原理 Java对象头 普通对象 一个对象头由mark word和klass word组成 mark word结构 如果该对象加锁,markword就会由原来的01标志位变成10,前面的hashcode,age,biased_lock由pty_to_heavyweight_monitor替代(也就是monitor地址) 工作原理 ...原创 2021-10-31 11:45:26 · 319 阅读 · 0 评论 -
synchronized详解
文章目录synchronized的互斥和同步线程不安全的解决方案synchronized关键字修饰范围解决i++线程不安全场景锁对象是不同实例的思考面向对象的编程重构 synchronized的互斥和同步 互斥是保证临界区的竞态条件发生,同一时刻只能有一个线程执行临界区代码 同步是由于线程执行的先后、顺序不同、需要一个线程等待其它线程运行到某个点 线程不安全的解决方案 阻塞式的解决方案:synchronized,Lock 非阻塞式的解决方案:原子变量 采用互斥的方式让同一时刻至多只有一个线程能持有原创 2021-10-30 21:39:56 · 162 阅读 · 0 评论 -
i++线程不安全体现
文章目录案例代码原理i++字节码指令内存模型出错情况并发图 案例代码 package thread; /** * @author pangjian * @ClassName Test * @Description 两个线程并发修改counter值,理想应该觉得是为0,但会导致线程不安全的情况,就会是其他值 * @date 2021/10/30 12:04 */ public class Test { static int counter = 0; public static原创 2021-10-30 12:18:31 · 103 阅读 · 0 评论