![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
jay1on
这个作者很懒,什么都没留下…
展开
-
ReentrantLock与AQS源码解析
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.(依赖先进先出的同步队列为阻塞锁和相关同步器(如信号量、事件等)提供实现的框架)显然,AQS内部使用的数据结构是先进先出的队列,队..原创 2020-07-23 16:07:23 · 432 阅读 · 0 评论 -
显示锁ReentrantLock的使用场景
有分布式锁为什么还要使用本地锁现在绝大多数的系统都采用了分布式架构,不管是内置锁synchronized还是显示锁Lock都无法跨jvm满足分布式要求,通常是使用redis等实现分布式锁来解决线程安全问题,那jdk为我们提供的锁已经无用武之地了吗?并不是,不管采用哪种方式实现的分布式锁(如数据库,redis、memcached,zookeeper)都涉及网络io开销,在需要频繁加锁释放锁的时候性能肯定远不如在本地内存中直接操作。所以更优的做法应该是先抢本地锁,持有本地锁的线程再去竞争分布式锁。显原创 2020-07-08 22:48:13 · 814 阅读 · 0 评论 -
Synchronized在JDK1.6中的优化
1.适应性自旋锁首先什么是自旋锁?有时候线程去竞争锁失败,进入了阻塞状态,但刚刚进入阻塞状态后持有锁的线程就释放了锁资源,这个时候线程又会被唤醒继续执行,考虑到这种情况,jdk1.4中引入了自旋锁的概念,就是在sychronized同步代码块中,如果线程没有竞争到锁,则让它先进行一段无意义的自旋,避免线程直接进入阻塞状态,自旋结束后如果持有锁的线程已释放锁,则当前线程可直接开始执行。显然,这样处理会有个坏处,如果每一次线程未竞争到锁都进行一段时间的自旋,且每一次自旋结束后都依然没有获取到锁,那么自旋的操原创 2020-07-01 12:56:10 · 1498 阅读 · 0 评论 -
ThreadLocal的使用及内存泄漏问题源码解析
ThreadLocal的作用ThreadLocal用于线程内数据共享,或者说线程间数据隔离。它可以实现在多线程中为每一个线程提供各自的变量副本。简单来说,使用ThreadLocal.set(obj)方法保存的数据,只能在同一线程中调用ThreadLocal.get()才能取出。ThreadLocal如何实现线程间隔离?首先看看ThreadLocal.set()方法将当前线程取出,获取线程中的成员变量ThreadLocalMap,将需要保存的值设置到此map中。所以每条线程..原创 2020-05-28 22:00:26 · 372 阅读 · 0 评论 -
使用ForkJoin框架实现归并排序
Fork/JoinFork/Join是一种采用“分治法”思想的框架,即将一个大问题拆分为无数个相同的小问题,然后各个击破再统一组装。jdk中的ForkJoinPool就是使用fork/join框架的多线程工具类(同其他线程池一样,扩展自抽象类AbstractExecutorService),我们只需要编写如何拆分任务的代码,它就能自动使用多线程去处理子任务,为我们屏蔽了线程的创建和使用细节,并且支持work−stealing(工作密取)。工作密取(work−stealing)在forkjoin中原创 2020-06-07 18:18:25 · 954 阅读 · 0 评论