![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
juc
文章平均质量分 64
互联网三高
高性能
高可用
高拓展
pmc0_0
想做一个优秀的Java后端开发工程师
展开
-
原子类Atomic
文章目录简介原子整数AtomicInteger相关API原子引用简介该类的实例操作能保证原子性,多个线程下可以保证线程安全原子整数AtomicInteger相关APIpublic class Test15 { public static void main(String[] args) { AtomicInteger i = new AtomicInteger(2); System.out.println(i.incrementAndGet())原创 2022-06-14 22:10:00 · 76 阅读 · 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 · 206 阅读 · 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 · 299 阅读 · 0 评论 -
JMM-可见性
文章目录Java内存模型代码解读volatile(易变关键字)synchronized区别Java内存模型JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面:原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响代码解读@Slf4jpublic class Test09原创 2021-11-03 13:57:40 · 125 阅读 · 0 评论 -
ReentrantLock
文章目录特性基本语法可重入可打断锁超时哲学家问题条件变量特性相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量基本语法reentrantLock.lock();try { // 临界区代码} finally { // 释放锁 reentrantLock.unlock();}可重入可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁,如果是不可重入锁,那么原创 2021-11-03 12:08:57 · 82 阅读 · 0 评论 -
活锁LiveLock
文章目录活锁代码区别解决方法活锁代码@Slf4jpublic 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 · 130 阅读 · 0 评论 -
Park & Unpark
文章目录基本使用与 Object 的 wait & notify 相比底层原理基本使用// 暂停当前调用者线程LockSupport.park();// 恢复某一个线程的运行LockSupport.unpark(暂停线程对象);@Slf4jpublic class Test04 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thre原创 2021-11-02 12:09:16 · 150 阅读 · 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 · 114 阅读 · 0 评论 -
偏向锁原理
文章目录简介偏向锁加锁原理撤销偏向调用hashCode方法其他线程使用对象调用wait/notify简介一个线程反复的去获取/释放一个锁,如果这个锁是轻量级锁或者重量级锁,不断的加解锁显然是没有必要的,轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行CAS操作。Java 6中引入了偏向锁来做进一步优化,只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。以后只要不发生竞争,这个对象就归该线程所有偏向锁主要用来优化同原创 2021-11-01 20:18:06 · 328 阅读 · 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 · 262 阅读 · 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 · 299 阅读 · 0 评论 -
synchronized详解
文章目录synchronized的互斥和同步线程不安全的解决方案synchronized关键字修饰范围解决i++线程不安全场景锁对象是不同实例的思考面向对象的编程重构synchronized的互斥和同步互斥是保证临界区的竞态条件发生,同一时刻只能有一个线程执行临界区代码同步是由于线程执行的先后、顺序不同、需要一个线程等待其它线程运行到某个点线程不安全的解决方案阻塞式的解决方案:synchronized,Lock非阻塞式的解决方案:原子变量采用互斥的方式让同一时刻至多只有一个线程能持有原创 2021-10-30 21:39:56 · 149 阅读 · 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 · 88 阅读 · 0 评论