
并发编程
文章平均质量分 72
记录java并发编程中的学习实战
还你一梦
路漫漫其修远兮,吾将上下而求索!
展开
-
《Java并发编程艺术》线程池的实现原理--04
概括首先线程池使我们在并发编程中运用最多的并发框架。线程池有效管理我们创建的线程,减少了线程创建和销毁带来的性能消耗。线程池实现原理图片来源于《Java并发编程艺术》判断核心线程池中的线程是否在都在执行任务,没有就在这里执行。否则进入加一个流程判断工作队列是否已经满了,没满就将任务提交到工作队列中,否则进入下一个阶段判断线程池中的线程是够都处于工作状态,不是就创建一个线程来执行该任务,否则就交给饱和策略来处理这个任务。之所以要设计这么多步骤,目的是为了在执行excute()方法是避免获原创 2021-05-07 13:28:59 · 100 阅读 · 0 评论 -
Synchronized原理
铺垫知识CAS: 刚刚重新温习了该知识,发现,CAS确实能够保证在对目标对象的修改的途中不会出现别的线程修改该值,但是可以引起类似于”幻读“的情况,如果线程A修改 aa=1,但线程B在线程A修改该值时对aa进行了修改,aa =2,那A线程第一修改失败了,但是线程A自旋继续尝试修改aa,第二次成功了,因为这期间里线程B修改aa=1相隔时间很短,当线程B读取aa值得时候,发现aa=2,这种情况就是类似于”幻读“,其实这种情况是避免不了的,我暂时没想到解决方案,你想你互斥的操作了,你厉害了,还不让人对aa进行操原创 2021-05-07 13:21:12 · 200 阅读 · 0 评论 -
深入分析 Volatile 的实现原理
整体认识Volatile是相对于synchronized来说的轻量级锁,其最大的特点是没有通过加锁的方式来解决线程可见性问题Volatile直解决了线程可见性问题,但没有提供原子性支持。Volatile的使用其实还是很有难度的,要正确的使用Volatile,避免出现因没有考虑原子性问题而出现使用不当问题,所以在正在开发中Volatile使用还是较少的。要充分的了解Volatile,要知道一下知识点指令重排序内存屏障缓存行缓存一致性问题缓存失效锁缓存关键知识什么是可见性在多核机器原创 2021-04-25 22:43:18 · 204 阅读 · 0 评论 -
Java AQS源码学习
整体认识注释看一下原文注释,我觉得原文注释能理解,对AQS已将理解一大半。不进行英文翻译了,平常没事了就拿出来读一读,慢慢加深理解/** * Provides a framework for implementing blocking locks and related * synchronizers (semaphores, events, etc) that rely on * first-in-first-out (FIFO) wait queues. This class is des原创 2021-04-21 23:12:08 · 258 阅读 · 0 评论 -
CAS认识
整体认识原子性的实现简单的 i++操作。使用的os地城指令为: cmpxchgjava对该指令进行了封装compareAndSetInt(this, VALUE, expectedValue, newValue)解释一下其中的参数意思:this: 表示当前对象VALUE: 表示该变量在当前对象地址的偏移量,该对象地址是展示的是地址始址expectedValue: 期望的值newValue:要改成的值;这个函数其实需要用户传入的是expectecValue 和 newValue,当该变量原创 2021-04-19 23:10:48 · 164 阅读 · 0 评论 -
Java并发编程艺术第二章-----第二遍读后记录
重点知识Lock前缀的指令在多核处理器下的作用是什么?缓存一致性协议是如何保证多个cpu缓存一直的,执行流程是什么?嗅探总线传输数据,是每个传输数据都要确认一遍吗?嗅探技术是如何实现的?实现volatile的两个原则是什么?monitorenter和monitor在synchonized实现起到什么作用?Java对象头存储了哪些信息?锁是如何升级的?偏向锁在Java15中已经废除了轻量级锁的加锁和解锁是怎么实现的?为什么轻量级锁在解锁时,锁有竞争者就会膨原创 2020-10-05 22:14:54 · 166 阅读 · 2 评论 -
Java并发编程艺术第一章---第二遍读书笔记
重点知识总结(不提供答案,只提供问题)如何减少上下文切换?如何避免死锁情况?资源限制是什么?如何解决资源限制问题?疑惑协程的概念和作用总结意在总结,第一章的知识很少,我知识提出自己学习时的问题,为了给自己一个思考的空间。答案书上有,但是我需要的是脱离书本的独立思考,而不是做一个知识的搬运工,将知识从书中搬运到博客中,这样做毫无意义。...原创 2020-10-04 22:20:50 · 108 阅读 · 0 评论 -
《Java并发编程艺术》Java并发容器和框架--03
1. ConcurrentHashMapHashMap扩容产生死锁产生死锁的原因是在多线程下,HashMap会产生死循环问题。HashTable效率太低因为是用synchronized来约束的,所以效率低ConcurrentHashMap的锁分段技术能有效的提高效率将数据分段化,没一段都用不同的锁来管理。就是所得粒度变大了,这样就增大了效率,不是一杆子全打死。ConcurrentHashMap数据结构segments数组ssizeconcurrencyLevel原创 2020-06-30 18:05:07 · 132 阅读 · 0 评论 -
《Java并发编程艺术---显示锁,可重入锁,读写锁---02
1. Lock互斥的,在请求锁时如果该锁别其它线程获取的时候,该线程将会被阻塞,放在该锁的阻塞队列中,当线程释放锁时,被阻塞的线程会被激活来判断是否是阻塞队列的头结点将会获得锁,依次下去。其中的阻塞队列是FIFO队列,这也是最简单的线程调用策略了。2. 可重入锁(ReentrantLock)相对于Lock,可重入锁式支持同一个线程获取锁的。列入递归方法,在方法中还可以调用该方法的。但是Lock不支持重入,会出现线程被自己阻塞的情况。(当前线程正在运行,当该线程请求锁时,返回的false,这样改线程原创 2020-06-29 18:59:57 · 167 阅读 · 0 评论 -
多线程编程-如何安全的取消线程
线程的取消以前的什么stop() suspend()方法都已经别取消了,那如何安全的终止线程呢?我们在多线程编程中,总是会终止线程,那该如何操作呢?今天看《Java并发编程艺术》这本书,在书中学到一种终止线程的方法。通过设置标志位,通过检测标志位来觉得是否要终止线程标志位用 volatile 来修饰,满足可见性。代码如下:public class Runner implements Runnable { private long i; private volatile b原创 2020-06-06 14:17:16 · 275 阅读 · 0 评论 -
Java并发编程艺术 -01
小知识下设计并发程序时会遇到两类资源不够用硬件资源解决方法是搭建集群软件资源使用连接池,比如线程池,数据库连接池,目的就是服用软件资源volatile实现原理是站在硬件的层面分析实现原理,记录关键字Lock前缀指令缓存锁定缓存一致性lock前缀指令将缓存写会内存,并使其他cpu的该地址缓存失效,通过缓存一致性协议来修改内容,并将修改的内容存到当前cpu的缓存中,这样可以保证修改的原子性,这就叫缓存锁定。 其他cpu缓存已经设置为无效标志,通过嗅探来发现一个处理器打算原创 2020-05-21 18:12:04 · 150 阅读 · 0 评论