自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(7)
  • 收藏
  • 关注

原创 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 423

原创 显示锁ReentrantLock的使用场景

有分布式锁为什么还要使用本地锁现在绝大多数的系统都采用了分布式架构,不管是内置锁synchronized还是显示锁Lock都无法跨jvm满足分布式要求,通常是使用redis等实现分布式锁来解决线程安全问题,那jdk为我们提供的锁已经无用武之地了吗?并不是,不管采用哪种方式实现的分布式锁(如数据库,redis、memcached,zookeeper)都涉及网络io开销,在需要频繁加锁释放锁的时候性能肯定远不如在本地内存中直接操作。所以更优的做法应该是先抢本地锁,持有本地锁的线程再去竞争分布式锁。显

2020-07-08 22:48:13 810

原创 Synchronized在JDK1.6中的优化

1.适应性自旋锁首先什么是自旋锁?有时候线程去竞争锁失败,进入了阻塞状态,但刚刚进入阻塞状态后持有锁的线程就释放了锁资源,这个时候线程又会被唤醒继续执行,考虑到这种情况,jdk1.4中引入了自旋锁的概念,就是在sychronized同步代码块中,如果线程没有竞争到锁,则让它先进行一段无意义的自旋,避免线程直接进入阻塞状态,自旋结束后如果持有锁的线程已释放锁,则当前线程可直接开始执行。显然,这样处理会有个坏处,如果每一次线程未竞争到锁都进行一段时间的自旋,且每一次自旋结束后都依然没有获取到锁,那么自旋的操

2020-07-01 12:56:10 1470

原创 使用ForkJoin框架实现归并排序

Fork/JoinFork/Join是一种采用“分治法”思想的框架,即将一个大问题拆分为无数个相同的小问题,然后各个击破再统一组装。jdk中的ForkJoinPool就是使用fork/join框架的多线程工具类(同其他线程池一样,扩展自抽象类AbstractExecutorService),我们只需要编写如何拆分任务的代码,它就能自动使用多线程去处理子任务,为我们屏蔽了线程的创建和使用细节,并且支持work−stealing(工作密取)。工作密取(work−stealing)在forkjoin中

2020-06-07 18:18:25 903

原创 ThreadLocal的使用及内存泄漏问题源码解析

ThreadLocal的作用ThreadLocal用于线程内数据共享,或者说线程间数据隔离。它可以实现在多线程中为每一个线程提供各自的变量副本。简单来说,使用ThreadLocal.set(obj)方法保存的数据,只能在同一线程中调用ThreadLocal.get()才能取出。ThreadLocal如何实现线程间隔离?首先看看ThreadLocal.set()方法将当前线程取出,获取线程中的成员变量ThreadLocalMap,将需要保存的值设置到此map中。所以每条线程..

2020-05-28 22:00:26 364

原创 记录一次文件句柄泄露引起too many file open问题的排查过程

最近发现生产项目上句柄数占用非常高,以下为大致排查过程首先查看进程占用句柄情况:lsof -p pid有大量jar_cachexxx.tmp文件处于open and deleted状态,缓存文件已经被删除,但是依然占用了句柄没有释放。在dump文件中查看对象情况如下:可以看到DeleteOnExitHook类中维护了一个LinkedHashSet,其中储存的内容就是...

2019-05-08 16:14:07 2883

原创 Android 直接在子线程中创建Handler为什么会报错

自从开始写代码以来,一直饱受取名之苦,这篇博客实在不知道该给它取个什么名字,总之,如果你的代码报了以下错误,说明你来对地方了 Can’t create handler inside thread that has not called Looper.prepare()采集用户操作的事件信息,例如某个用户在何时采用了何种支付方式购买了何种产品,可以在购买成功的回调中将数据信息封装为Ma

2016-10-31 23:19:10 4394 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除