![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 90
~Maple~
帅
展开
-
还不会 happens-before,冰冰教你啊
为什么要有 happens-beforehappe-before 是 JMM 最核心的概念,对应 Java 程序员来说,理解 happens-before 是理解 JMM 的关键。从 JMM 设计者的角度来看,可见性和有序性其实是互相矛盾的两点:一方面,对于程序员来说,我们希望内存模型易于理解、易于编程,为此 JMM 的设计者要为程序员提供足够强的内存可见性保证,专业术语称之为 “强内存模型”。而另一方面,编译器和处理器则希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化(比原创 2022-01-02 15:24:24 · 267 阅读 · 0 评论 -
吊打面试官之 Java 线程池详解
一、线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。我们这里所说的线程池是指DK中提供的ThreadPoolExecutor类。使用线程池的好处:原创 2021-10-27 19:21:42 · 173 阅读 · 0 评论 -
全网最详细的volatile讲解
volatile详解常见面试题volatile关键字的作用是什么?volatile能保证原子性吗?之前32位机器上共享的long和double变量的为什么要用volatile?i++为什么不能保证原子性?volatile是如何实现可见性的?volatile是如何实现有序性的?volatile的作用1、volatile保证可见性概念:volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。原创 2021-09-13 23:02:05 · 639 阅读 · 0 评论 -
全网最详细的Synchronized讲解
Synchronized常见问题什么是锁的升级和降级什么是JVM里的偏向锁、轻量级锁、重量级锁不同JDK里的Synchronized的实现Synchronized的使用代码块形式:synchronized (this) // 这个括号中的对象可以是this,也可以是自定义的 Object{ // 还可以是这个类的class对象, 类.class // 同步代码块 }方法形式: public synchronized void me原创 2021-09-13 23:00:22 · 208 阅读 · 0 评论 -
可见性、原子性和有序性
可见性、原子性和有序性一、缓存导致的可见性问题单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存一致性容易解决。因为所有的线线程都是在操作同一个CPU的缓存,一个线程对缓存的写,对另一个线程来说一定是可见的。一个线程对共享变量的修改,另一个线程能够立刻看到,我们称之为可见性。多核时代,每颗CPU都有自己的缓存,这时CPU缓存与内存的数据一致性就没那么容易解决了,当多个线程在不同的CPU上执行时,这些线程操作的是不同的CPU缓存。举例:public class T原创 2021-01-28 20:34:03 · 228 阅读 · 4 评论 -
Java内存模型:看Java如何解决可见性和有序性问题
Java内存模型:看Java如何解决可见性和有序性问题一、什么是Java内存模型?导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是会造成程序性能堪忧。合理的解决方案是按需禁用缓存以及编译优化。Java内存模型规范提供了JVM如何按需禁用缓存和编译优化的方法,包括volatile、synchronized和final关键字,以及六项Happens-Before规则。二、使用volatile的困惑volatile最原始原创 2021-01-30 19:48:35 · 81 阅读 · 0 评论 -
互斥锁(上):解决原子性问题
互斥锁(上):解决原子性问题一、原子性问题到底该怎么解决呢?解决原子性的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换时依赖CPU中断的,所以禁止CPU发生中断就能够禁止线程切换。以32位CPU上执行long型变量的写操作为例来说明,long型变量是64位,在32位CPU上执行写操作会被拆分为两次写操作(写高32位和写低32位,如图所示)。在单核CPU场景下,同一时刻只有一个线程执行,禁止CPU中断,意味着操作系统不会重新调度线程,也就是禁止了线程切换,获原创 2021-01-30 19:51:22 · 163 阅读 · 0 评论 -
互斥锁(下):如何用一把锁保护多个资源
如何用一把锁保护多个资源一、保护没有关联的多个资源举例:class Account { 锁:保护账户余额 private final Object balLock = new Object(); 账户余额 private Integer balance; 锁:保护账户密码 private final Object pwLock = new Object(); 账户密码 private String password; 取款原创 2021-01-30 19:52:41 · 169 阅读 · 0 评论 -
死锁
死锁一、解决并发问题用两把锁实现,转出账本一把,转入账本另一把。在 transfer() 方法内部,我们首先尝试锁定转出账户 this(先把转出账本拿到手),然后尝试锁定转入账户 target(再把转入账本拿到手),只有当两者都成功时,才执行转账操作。class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 syn原创 2021-01-30 19:53:56 · 87 阅读 · 0 评论