并发编程艺术
文章平均质量分 90
欧阳田
生活没有对与错,一路爬行。
展开
-
compareAndSet(CAS, 自旋锁)理解
背景CAS?自旋是什么意思?CAS是怎么保证原子性操作的?CAS带来的ABA问题,及解决方案?过程CAS compareAndSet,compareAndExchange,compareAndSwap这个函数会先进行比较,如果相比较的两个值是相等的,那么就进行更新操作。CAS使用场景AtomicInteger atomicInteger = new AtomicInteger(1);atomicInteger.compareAndSet(1, 2);初始值是1compar原创 2020-12-13 17:06:27 · 24257 阅读 · 5 评论 -
java无锁,偏向锁,轻量级锁,重量级锁
背景纤程(协程),线程锁状态概念理解锁升级过程理解过程纤程(协程),线程纤程和协程表示同一个概念。是处于用户态的线程且与内核态的线程数的比例是m:n。在用户态切换线程的时候,不需要操作系统的辅助。一般m是远大于n的。线程,可以理解为用户态的线程与内核态数量是1:1的对应关系。当用户态的线程进行切换的时候,需要操作系统进行辅助。对象头基础知识对象头中的markwork标识着对象的锁状态信息。mark word 包含的内容 : 对象哈希码,对象分代年龄,指向锁记录的指针,指向重量级锁记原创 2020-12-13 16:00:20 · 297 阅读 · 0 评论 -
对乐观锁和悲观锁的理解
背景凡是出现并发问题,第一个想到的就是锁。什么是乐观锁?使用的场景是什么?什么是悲观锁?使用的场景是什么?过程乐观锁 - 整个过程是没有上锁的系统是一定需要支持事务的。在这样的条件下,对并发控制来说,使用乐观锁(乐观并发控制)。在读多写少的场景中,乐观锁是非常有效率的。多个线程可以同时读同样的数据。在这整个过程,会持续检测冲突,并防止多个线程尝试修改这同样的数据。整个过程中,只有一个线程会更新成功,其他会更新失败。更新失败的,会进行事务回滚,并且抛出异常。不上锁,性能高。乐观锁理解原创 2020-08-07 13:45:51 · 466 阅读 · 0 评论 -
synchronized理解
背景理解并记忆实例对象布局理解并记忆对象头布局对象的状态过程实例对象布局对象头(mark word, class pointer)实例数据对齐填充(保证是8个字节的整数倍,方便机器加载或者读取字节到内存或者寄存器)对象头布局mark word : 对象哈希码,对象分代年龄,指向锁记录的指针,指向重量级锁记录的指针,GC标记,偏向线程ID,偏向时间戳klass pointer: 类型指针。 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实原创 2020-08-02 19:08:22 · 214 阅读 · 0 评论 -
ThreadLocal总结二:整理文档及谈论能够学到什么
背景知识整理写过关于ThreadLocal的相关文档。写了这么多文档,学到了什么?过程文档入口ThreadLocal:基础知识及其应用ThreadLocal:内存泄漏分析及其解决方案ThreadLocal:在线程池中使用存在的问题及其解决方案ThreadLocal:工作过程ThreadLocal源码阅读:散列算法,魔数 0x61c88647 学习ThreadLocal...原创 2020-03-08 22:52:25 · 229 阅读 · 0 评论 -
ThreadLocal总结一:问题及其理解汇总
背景整理ThreadLocal重要问题及其相关理解。过程如何分析内存泄漏?首先,ThreadLocal作者认为如果ThreadLocal实例不在被线程使用了的话,那么ThreadLocal实例就没有存在的必要了。一旦线程不使用了,那么下次GC的时候就会把ThreadLocal移除掉。因此把ThreadLocal设计成弱引用。其次,在当前线程执行的一段时间内,如果大量积累值 v ...原创 2020-03-08 22:29:11 · 343 阅读 · 0 评论 -
ThreadLocal源码阅读七:核心方法remove源码探究
背景过程小结原创 2020-03-08 21:07:17 · 228 阅读 · 0 评论 -
ThreadLocal源码阅读六:核心方法get源码探究
背景过程小结原创 2020-03-08 20:35:48 · 179 阅读 · 0 评论 -
ThreadLocal源码阅读五:核心方法set源码探究
背景推荐阅读工作过程,魔数,解决hash碰撞get源码探究过程小结从源代码中学到什么?结构布局,设计得很好。而且,散列以及解决hash碰撞。为什么要把ThreadLocal设计成弱引用呢?有这样的必要吗?...原创 2020-03-07 20:22:07 · 760 阅读 · 0 评论 -
ThreadLocal源码阅读四:如何解决hash碰撞的?
背景推荐阅读ThreadLocal工作过程理解ThreadLocal中的三个核心方法的具体实现过程。过程get的实现setremove为什么代码都是在使用的时候,才去判断,是否有,如果没有应该怎么办?如果有又怎么办?为什么不是一开始,就把准备工作做好呢?如果一开始就做好的话,那如果用不到,那么占用的CPU资源和内存资源就白白浪费了。所以很多写代码都是,一边作...原创 2020-03-07 17:18:17 · 1040 阅读 · 0 评论 -
ThreadLocal源码阅读三:散列算法,魔数 0x61c88647 带来的疑问与思考
背景推荐阅读此魔数的基础知识。魔数 0x61c88647学习疑问:用这个魔数来解决hash碰撞,可行吗?ThreadLocal又是怎么解决hash碰撞的?思考:ThreadLocal设计的环形Entry[]数组可以节约更多空间,减少扩容的频次。环形数组设计对产生hash碰撞有什么影响吗?过程小结...原创 2020-03-07 15:43:51 · 856 阅读 · 0 评论 -
ThreadLocal源码阅读二:如何保证取到最新值的?
背景推荐阅读此魔数的基础知识。魔数 0x61c88647学习魔数 0x61c88647被ThreadLocal源码使用而产生的思考:ThreadLocal是怎么保证取到最新值的?比如,一个Integer类型的值,假如默认是0。现在,先执行一次set操作,值为1;然后在执行一次set操作,值为2。这个时候执行get操作,发现拿到的值是2。过程散列算法运作过程理解ThreadLo...原创 2020-03-05 22:20:48 · 453 阅读 · 0 评论 -
ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习
背景为什么选择此魔数?过程源代码例子演示及其结果长度为16: 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0长度为32: 7 14 21 28 3 10 17 24 31 6 13 20 27 2 9 16 23 30 5 12 19 26 1 8 15 22 29 4 11 18 25 0长度为64: 7 14 21 28 35 42 4...原创 2020-03-03 23:59:36 · 518 阅读 · 2 评论 -
ThreadLocal理解四:工作过程
背景推荐阅读ThreadLocal 理解一:基础知识及其应用推荐阅读ThreadLocal理解二:内存泄漏过程分析及其解决方案推荐阅读ThreadLocal理解三:在线程池中使用存在的问题及其解决方案Thread和ThreadLocalMap关系是什么?ThreadLocal及其ThreadLocalMap相互之间的关系?ThreadLocal是怎么保证线程安全的?大致工作过程是怎...原创 2020-02-22 19:47:07 · 394 阅读 · 0 评论 -
ThreadLocal理解三:在线程池中使用存在的问题及其解决方案
背景推荐阅读ThreadLocal 理解一:基础知识及其应用推荐阅读ThreadLocal理解二:内存泄漏过程分析及其解决方案在线程池中使用ThreadLocal会存在什么问题呢?过程引发出问题的例子演示代码测试类代码中添加一个静态内部类测试代码类的入口函数结果分析线程池中固定了3个线程。很明显,线程id为11、12和13,每个线程都抢到一...原创 2020-02-20 22:19:24 · 2546 阅读 · 0 评论 -
ThreadLocal理解二:内存泄漏过程分析及其解决方案
背景推荐阅读ThreadLocal的基础知识及其基本使用。ThreadLocal 理解一:基础知识及其应用内存泄露 (MemoryLeak)程序在申请内存后,系统无法释放已申请的内存空间,少量的内存泄露危害可以忽略,但内存泄露慢慢堆积,后果很严重,无论多少内存,迟早会被占光。内存溢出 (OutOfMemory)程序在申请内存时,系统没有足够的空间分配。也就是,分配的内存超出...原创 2020-02-19 23:04:10 · 975 阅读 · 0 评论 -
ThreadLocal 理解一:基础知识及其应用
背景ThreadLocal是一个“轻量级的锁”,虽然可以理解为线程私有的,但是本质上还是多个线程共享一个变量实例,这个实例持有ThreadLocal属性,核心内容ThreadLocal实战。以及对例子的解释说明。ThreadLocal是什么?为什么有ThreadLocal?它解决了传统synchronized性能慢的问题。ThreadLocal vs synchronized使用场...原创 2020-02-18 23:18:56 · 454 阅读 · 0 评论 -
并发编程锁的知识(从Netty中学到的)
背景多线程一般有什么问题?那就是线程不安全。而如何保证线程安全呢?上锁上锁也可以理解同步用了锁又会产生什么问题?那就死锁或者严重影响性能过程同步问题核心三要素? 来源复建老师的Netty教学视频原子性:“并无一气呵成,岂能无懈可击”可见性:“你做的改变,别人看不见”。有序性:“不按套路出牌”。比如指令重排序。i++之类的锁的分类?对竞争的态度:乐观锁(jav...原创 2020-02-10 20:26:00 · 341 阅读 · 0 评论 -
并发编程的相关实战
背景JDK下concurrent包是怎么实现的?Spring是怎么保证线程安全的?Netty是怎么进行并发编程的?并发编程实战JDK并发编程实战。concurrent包实践。volatile的运用synchronized的运用final的运用CAS的运用由这些小知识构建成AQS的工作,而AQS是concurrent包工作的底层核心逻辑。阻塞队列。而阻塞队列是AQS...原创 2020-02-10 20:02:34 · 189 阅读 · 0 评论 -
多线程最基本的概念理解
背景多线程入门知识挺多的,尤其是JMM需要学习。JVM内存模型也需要学习。很多概念需要搞明白,比如进程,线程,协程,守护线程,用户线程,线程上下文切换,共享变量,局部变量,用户空间,内核空间,单例,多例等等。线程间通信表达什么意思。线程间如何交换数据。业务逻辑和线程的隔离(Runnable, Thread)。线程的生命周期。核心概念理解进程比如Java程序一旦起来,其实就是Java...原创 2020-02-10 19:23:26 · 232 阅读 · 2 评论