小小工匠
show me the code ,change the world
展开
-
实战并发编程 - 10Guarded Suspension模式在BlockingQueue源码中应用
文章目录PreAnother Case源码分析Pre实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true) 中引出并讲解了Guarded Suspension “保护性暂挂模式”的运用。这种“保护性暂挂”模式可以大大降低多线程获取锁时锁冲突带来的性能开销,当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再访问。如果线程01拿不到所有的锁,就阻塞自己,进入“等待WAITING”状态。当线程01要求的所有条件都满足后,通知等待状态的线程01继续原创 2021-08-22 08:48:03 · 23792 阅读 · 1 评论 -
实战并发编程 - 09多线程Guarded Suspension模式案例实战
文章目录需求Code需求实现一个报警的功能: 一旦监察到异常,就会向报警中心服务器上传报警信息,然后由报警中心程序通知对应的人员或者系统进行处理。我们先实现以下几个最重要的功能:建立连接,确保报警模块和报警服务器连接建立检查心跳,定时调度来检查和报警服务器的连接状态是否正常重新连接,报警模块和报警中心失去连接后,重新建立连接发送报警,发送报警信息给报警服务器(当还未建立连接的时候同步阻塞等待)画个类图:init: 初始化报警服务,和报警服务器建立连接,并定时原创 2021-08-22 07:50:39 · 23791 阅读 · 0 评论 -
实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)
文章目录Guarded Suspension模式简介Guarded Suspension模式简介guarded在这里是“保护”的意思;suspension在这里是“暂时挂起”的意思。所以,Guarded Suspension模式又称为“保护性暂挂模式”;在多线程开发中,常常为了提高应用程序的并发性,会将一个任务分解为多个子任务交给多个线程并行执行,而多个线程之间相互协作时,仍然会存在一个线程需要等待另外的线程完成后继续下一步操作。而Guarded Suspension模式可以帮助我们解决上述的等待原创 2021-08-15 20:00:24 · 21326 阅读 · 0 评论 -
实战并发编程 - 07循环等待&死锁问题
文章目录PrePre【账户A】转账给【账户B】,同时【账户B】也转账给【账户A】,两个账户都需要锁住余额,所以通常会申请两把锁。转账时,先锁住自己的账户,并获取对方的锁,保证同一时刻只能由一个线程去执行转账。这时可能就会出现,对方给我转账,同时我也给对方转账,那么双方都持有自己的锁,且尝试去获取对方的锁,这就造成可能一直申请不到对方的锁,循环等待发生“死锁”的问题!如果系统中出现线程循环等待的情况,用户体验肯定是极差的。...原创 2021-08-14 11:33:17 · 24589 阅读 · 0 评论 -
实战并发编程 - 06线程在执行过程中的状态是如何流转的
文章目录线程的生命周期线程的生命周期java.lang.Thread中 线程状态State枚举原创 2021-08-14 09:52:03 · 24215 阅读 · 0 评论 -
实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW
文章目录Pre等效不可变对象实例变量array就是一个等效不可变对象?Pre本篇文章我们分析一下等效不可变对象在在源码中的应用,主要是围绕CopyOnWriteArrayList的原理来展开,CopyOnWriteArrayList的源码中运用了不可变对象模式,使得集合在进行遍历操作的时候,不用加锁也能保证线程安全。等效不可变对象通过前面的文章分析,我们知道了什么是不可变对象,而等效不可变对象的意思就是说对象基本符合不可变对象的一些特征,但是某些情况下内部状态可能会改变,这样的解释可能有点难原创 2021-08-13 22:57:02 · 24515 阅读 · 0 评论 -
实战并发编程 - 04基于不可变模式解决并发问题_2
文章目录Pre业务描述短信服务商基本信息短信路由网关基于不可变模式改造代码Pre实战并发编程 - 03基于不可变模式解决并发问题_1 中我们通过一个案例了解了可变类可能会导致什么样的线程安全问题,同时也学习了什么是不可变类,如何将一个可变类改造为一个不可变类。本篇文章则继续基于一个真实的“百万流量的短信网关系统”,更深入地讲解如何通过不可变模式来解决并发问题的。业务描述首先介绍一下业务背景,有一个每天有百万流量的短信网关系统,这个系统会使用第三方短信服务商(比如说阿里云、腾讯云、百度云等等)原创 2021-08-13 00:51:17 · 24270 阅读 · 0 评论 -
实战并发编程 - 03基于不可变模式解决并发问题_1
文章目录Pre潜在线程不安全的问题解决方案(不可变类)如果当前类被子类继承还是一个不可变类吗?Pre举个例子 : 对车辆的信息进行跟踪,其中车辆的位置信息的代码如下图位置信息类,包含代表坐标的变量X和Y,和用来对车辆位置信息进行更新的方法setXY,接下来我们看下实现车辆信息追踪代码潜在线程不安全的问题当车辆的位置信息发生变更的时候,我们可以调用updateLocation方法来更新车辆的位置,另外也可以通过调用getLocation方法来获取车辆的信息。但Location类的setXY原创 2021-08-12 23:51:20 · 23818 阅读 · 0 评论 -
实战并发编程 - 02解决并发问题常用套路
文章目录Pre解决并发问题的方法无锁的方式解决并发问题局部变量不可变对象ThreadLocalCAS原子类有锁的方式解决并发问题synchronized关键字ReentrantLock可重入锁Pre解决并发问题的方法解决并发问题的方法分为两大类:无锁和有锁。无锁可分为:局部变量、不可变对象、ThreadLocal、CAS原子类;有锁的方式又分为synchronized关键字和ReentrantLock可重入锁。无锁的方式解决并发问题局部变量不可变对象ThreadLocalCAS原原创 2021-08-12 06:55:20 · 23888 阅读 · 0 评论 -
实战并发编程 - 01多线程读写同一共享变量的线程安全问题深入剖析
文章目录示例CPU的内存模型Java内存模型示例来看个需求: 统计服务器某个接口的访问次数accessCount字段表示接口被访问的次数, 每次访问接口的时候就调用一次access()方法,访问次数+1,累积下来,就能统计出接口被访问的次数了。接口很可能被多个线程同时访问,即access()方法被多个线程调用。那么问题来了:多线程调用access()方法时,接口访问次数统计的结果是否能保证准确呢?显而易见:不能。CPU的内存模型接下来分析一下为什么上面统计的结果会有问题.我们先来简单理原创 2021-08-11 22:40:14 · 24393 阅读 · 0 评论