深入理解多线程
文章平均质量分 73
多线程学习
技术无产者
心之所向,素履以往,生如逆旅,一苇以航!
展开
-
ThreadLocalMap中为什么valu是强引用,不是弱引用
这里假设value和threadlocal都是弱引用,假如threadlocal除了 被Entry这个弱引用所引用之外,还被强引用,则这时value的值还没被获取,也就是value 这时只被Entry这个弱引用所引用,这时候发生gc,threadlocal不会被回收,value回被回收 ,导致通过threadlocal获得value值时获得为Null。...原创 2022-01-15 20:09:38 · 3596 阅读 · 10 评论 -
AQS源码学习
Java并发之AQS详解 - waterystone - 博客园java、多线程、并发、AbstractQueuedSynchronized、AQS、Lock、Mutex、ReentrantLock、Semaphore、CountDownLatch、线程同步https://www.cnblogs.com/waterystone/p/4920797.html学这篇文章中存在几个疑惑的地方做以记录:1.head节点的线程是当前持有资源可运行的线程,第 二个节点在parkAndCheckInterrupt原创 2021-12-13 11:19:50 · 284 阅读 · 0 评论 -
synchronized的底层实现原理
1.JDK1.6对synchronized做的优化:传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,在linux上使用mutex互斥锁,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。对于加了synchronized关键字但运行时并没有多线程竞争,或两个线程接近于交替执行的情况,使用传统锁机制无疑效率是会比较低的。Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向..原创 2021-12-09 10:45:43 · 578 阅读 · 0 评论 -
尽量使用notifyAll,而不用notify
wait与notify,notifyAll他们都是Object类的方法,一般用在synchronized代码块中,用于当线程某个条件不满足时,通过wait()挂起线程,将线程加入到阻塞队列中。而当条件满足时,通过notify唤醒阻塞的线程,被唤醒的线程将会从wait()阻塞的位置继续执行。这是官方推荐的使用格式是: synchronized (obj) { while (条件不成立) obj.wait(); ... // Perfor.转载 2021-10-22 11:47:00 · 557 阅读 · 0 评论 -
LongAdder原理分析
LongAdder由来LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足于此,因为非常搞并发的请求下AtomicLong的性能是不能让人接受的。如下AtomicLong 的incrementAndGet的代码,虽然AtomicLong使用CAS算法,但是CAS失败后还是通过无限循环的自旋锁不多的尝试,这就是高并发下CAS性能低下的原因所在。源码如下:public转载 2021-10-21 11:43:53 · 163 阅读 · 0 评论 -
Synchronized
1.Synchronized锁对象的访问public class MyRunnable implements Runnable { static Object object=new Object(); @SneakyThrows @Override public void run() { System.out.println(Thread.currentThread().getName()+" "+object); synchro..原创 2021-09-25 10:46:20 · 101 阅读 · 0 评论 -
正确理解同步/异步和阻塞/非阻塞的区别:
之前一直把异步和非阻塞混为一谈,在 了解BIO和NIO的区别时才发现了两者的差异,看了网上很多文章觉得说的总是差点意思,下面是个人理解:1.同步 非同步 阻塞 非阻塞 概念https://www.zhihu.com/question/197324732.同步/非同步和阻塞/非阻塞的区别:https://blog.csdn.net/qq_35503998/article/details/82835517这篇将的比较中肯3.BIO和NIO的区别:https://zhuanlan.zh原创 2021-09-09 14:54:46 · 2821 阅读 · 1 评论 -
多线程中主存与线程工作空间同步数据的时机
在测试volatile关键字如何保证数据在多个线程中的可见性问题的时候,引发的思考!对于一个临界资源,如果使用volatile关键字修饰,那么就可以保证该变量在多个线程中可见。对于原理的理解不是很难,但是使用到代码来模拟多线程问题的时候,对于何时从主存读取共享变量何时将工作内存刷写到主存的时机却不是特别清楚。导致对于多线程理解不够透彻!1、线程的工作内存刷写到主存以及从主存读取到工作内存的时机问题描述:一个线程何时会从主存中去重新读取共享变量的值,又是何时需要将工作内存的值重新刷写...转载 2021-08-16 09:16:15 · 846 阅读 · 2 评论 -
JAVA线程-CPU缓存和内存模型
在我工作的十几年里,写了很多 Java 的程序。同时,我也面试过大量的 Java 工程师。对于一些表示自己深入了解和擅长多线程的同学,我经常会问这样一个面试题:“volatile 这个关键字有什么作用?” 如果你或者你的朋友写过 Java 程序,不妨来一起试着回答一下这个问题。就我面试过的工程师而言,即使是工作了多年的 Java 工程师,也很少有人能准确说出 volatile 这个关键字的含义。这里面最常见的理解错误有两个,一个是把 volatile 当成一种锁机制,认为给变量加上了 volatile,转载 2021-08-14 10:51:35 · 465 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volat转载 2021-08-14 09:46:35 · 138 阅读 · 0 评论