![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
文章平均质量分 92
Java并发编程
程序猿洞晓
不忘初心,方得始终。
展开
-
JDK7、8对ConcurrentHashMap的实现和总结
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,无论对于Java并发编程的学习还是Java内转载 2022-03-17 15:30:00 · 568 阅读 · 0 评论 -
死锁的两种体现形式分析和解决方案
死锁在多线程开发过程中比较经常遇到,并且这个问题很隐性,很难排查到问题的所在,即使是查看项目的日志都找不到,很让人头疼。死锁的体现形式主要有两种,分别是简单的死锁和动态死锁,简单死锁在写代码的时候很容易避免,动态死锁就很麻烦。因为出现死锁的主要原因是两个锁的加锁顺序不同,动态死锁看似是加载顺序都相同,但是实际不同,所以一旦发生,就很难排查。死锁的原因和体现形式原因两个线程分别是A线程、B线程两个资源分别是SA和SB在操作SA资源同时也要对SB资源进行操作,为了让两个资源能够保证线程安全,需要锁原创 2022-03-18 08:39:40 · 1045 阅读 · 0 评论 -
原子操作CAS和相关原子操作类的实现原理
众所周知锁有两种:乐观锁与悲观锁。独占锁是一种悲观锁,而 synchronized 就是一种独占锁,synchronized 会导致其它所有未持有锁的线程阻塞,等待持有锁的线程释放锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。而乐观锁用到的机制就是CAS。CAS(Compare And Set)Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三转载 2022-03-17 14:30:00 · 263 阅读 · 0 评论 -
AQS实现方式和独占锁、共享锁的原理分析
AQS是AbstractQueuedSynchronizer类的简写,这个是锁的一个设计模式,在Java中很多锁都会用到AQS,如常用的显示锁ReentrantLock、ReentrantReadWriteLock等内部的锁都是继承AQS。AQS的基本的设计模式是模板方法模式,具体锁的获取和释放实现逻辑由类自身来实现,这些方法的组合,以及线程队列获取锁的机制是由AQS自身来完成。AQS介绍AQS设计模式AQS的基本设计模式是模板方法模式,听起来有点抽象,这里就不直接看源码,先根据这个模式写个Demo,原创 2022-03-17 14:45:00 · 2037 阅读 · 0 评论 -
死磕Java并发:J.U.C之重入锁ReentrantLock
此篇博客所有源码均来自JDK 1.8ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。API介绍如下:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没转载 2022-03-17 15:00:00 · 102 阅读 · 0 评论 -
死磕Java并发:深入分析ThreadLocal原理
ThreadLoacal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?API是这样介绍它的:This class provides thread-local variables. These variables differ from their norma转载 2022-03-17 15:45:00 · 132 阅读 · 0 评论 -
Fork-Join内部实现原理分析
在做一个长的任务的时候,需要消耗的时间很长,但是这个时候主流程又要等待这个长任务执行结束后才能执行。如这里这个长任务可能是从数据库中查出报表数据,计算封装出可以写入到报表的数据,主流程在等待往报表中写数据,但是长任务中迟迟计算不出报表数据,因此这里就需要考虑多线程,如果直接创建一个子线程,主线程还是需要等待这个子线程执行结束,这个方案不可选。基本思路就是常见多个线程同时对数据进行计算,然后将计算的结果封装到一起返回给主流程。使用Fork-Join工具就是一个很好的解决方案,Fork-Join是在jdk1.原创 2022-03-18 08:39:28 · 306 阅读 · 0 评论 -
线程池ThreadPool浅层面原理分析
为什么使用线程池线程池是作为程序员必备的技能,合理的使用线程池也是必须的,但是在实际开发过程中,使用线程池的参数都是复制粘贴来的,也不会去考察线程池设计是否符合实际使用场景,是否合理,这篇文章不会深入去说线程池的原理,但是基本的配置参数说明还是有的,希望能对大家开发有用。为什么要使用线程池:降低资源的消耗,降低线程创建和销毁时对资源的消耗;提高响应时间(需要一个新线程执行任务,基本都是创建、执行、销毁,对应的时间分别是:T1、T2、T3,如果每次都是这样操作,是很浪费时间和对计算机资源的浪费,使用原创 2022-03-18 08:39:50 · 232 阅读 · 0 评论 -
死磕Java并发:深入分析synchronized的实现原理
记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。诚然,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了。下面跟随LZ一起转载 2022-03-18 08:40:04 · 237 阅读 · 0 评论 -
Java并发编程:如何实现线程间通信的N种场景和对应的实现方式
正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。文前说明本文涉及到的知识点:thread.join()object.wait()object.notify()CountDownLatchCyclicBarrierFutureTaskCallable本文主要的切入点如何让两个线程依次执行?那如何让两个线程按照指定方式有序交叉运行呢?四个线程 A B C D,其中 D 要等到 A B C 全执行完原创 2022-03-18 08:40:18 · 400 阅读 · 0 评论 -
ThreadLocal遇到线程池出现数据问题和解决方案
ThreadLocal开发中常用,通过ThreadLocal操作数据实现线程之间的隔离,保证线程之间不会因为操作同一数据导致数据安全问题。但是这种隔离是有适用范围的,也就是说在某些特定的情况下还是会出现数据安全问题的。这种特定情况下就是使用到线程池,并且在ThreadLocal使用前后没有做数据清理,就会导致安全问题,下面来看看出现的情况和具体怎么去解决。ThreadLocal正常使用一个main方法的主线程,再创建一个新的线程作为模拟线程,同时操作ThreadLocal,通过在打印对应的输出值来看Th原创 2022-03-21 08:56:59 · 3222 阅读 · 6 评论