多线程
文章平均质量分 63
陈脩
从猪场到西溪,从事多年电商业务开发
展开
-
JVM内部锁升级过程(偏向锁,轻量级锁,重量级锁)
目录对象在内存中是如何布局的如何查看对象在内存中的布局markword数据结构加锁后发生了什么偏向锁什么是偏向锁为什么需要偏向锁为什么从JDK15开始默认关闭偏向锁JDK8 为什么要延迟4S后开启偏向锁锁升级流程对象在内存中是如何布局的在聊到对象加锁这个话题,那就必须先聊聊对象在内存中的布局, 你知道一个对象在内存中是如何布局的吗?一个对象new出来以后,它在内存中主要分为一下四个部分:markword 这部分就是加锁的核心,占8个字节 .原创 2022-05-30 23:37:41 · 2082 阅读 · 0 评论 -
JDK8 ReentrantReadWriteLock源码分析
ReentrantReadWriteLock中的state代表了读锁的数量和写锁的持有与否,整个结构如下:在本文中对AQS部分源码不在讲解,可以参考AbstractQueuedSynchronizer源码分析 首先从读锁开始看起readLock.lock() /** * 获取读锁 * 如果写锁没有被其他线程占有,获取读锁后...原创 2018-03-09 16:24:26 · 194 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS)源码分析
目录AQS结构Node结构AQS阻塞链表ReentrantLockReentrantLock FairSyncReentrantLock NonfairSyncConditionCountDownLatch为了搞清楚AQS到底是有什么特性需要先看看AQS有哪些属性AQS结构通过结构图可以看到主要的属性有hea...............原创 2017-06-26 09:44:13 · 365 阅读 · 0 评论 -
java多线程lock详解
Lock是JDK1.5种新增的同步工具,其实真正的实现Lock接口的类就三个,ReentrantLock和ReentrantReadWriteLock的两个内部类(ReadLock和WriteLock实现了Lock的接口); ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。我们也一直在强调这个特点。显然这个特...2016-03-01 21:06:14 · 197 阅读 · 0 评论 -
ScheduledThreadPoolExecutor与Timer
Timer类负责管理延迟任务以及周期任务。然而,Timer存在一些固有的缺陷。 Timer 在执行定时任务时只会创建一个后台线程。如果某个线程执行的时间过长,那么将破会其他定时任务的精确性。 Timer的另一个问题是,如果TimerTask抛出一个非检查异常,由于Timer不捕获异常导致终止定时任务线程。在这样情况下,Timer无法恢复线程的执行,而是错误地认为整个Timer都...2014-11-12 16:43:36 · 187 阅读 · 0 评论 -
隐式使用This 引用逸出
发布(Publish)一个对象是指使对象能够在当前作用域之外的代码中被使用。例如将指向该对象的引用保存到其他代码可以访问到的地方 ,或者在一个非私有的方法中返回一个对象的引用或者将该引用传递到其他类的方法中。当发布一个对象时,在该对象的非私有域中的引用同样被发布出去,一般来说如果一个已经发布的对象能够通过非私有的变量和方法调用到其他的对象那么这个对象也被发布。 逸...2014-11-03 10:19:59 · 536 阅读 · 0 评论 -
线程安全
线程安全的定义:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调用代码中不需要额外的同步和协调,这个类都能表现出正确的行为,那么这个类就是线程安全的。 线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生非常奇怪的结果。 如果当多个线程访问一个可变的共享变量...2014-10-25 22:06:54 · 75 阅读 · 0 评论 -
Lock和Synchronized的不同
在 Java 中线程的状态可以分为:新建(New),运行状态(Runnable)、阻塞状态(Blocked)、等待状态(Waiting)、结束状态(Terminated)。运行状态可以转为 阻塞状态或等待状态。 在接收完基本概念后,我们看看显示锁(Lock)和内部锁(synchronized)有什么不同。Lock 支持更细粒度的同步控制Lock是无阻塞锁,synchron...2014-10-23 23:12:51 · 96 阅读 · 0 评论 -
Volatile不能保证数据同步
首先接受 java 的内存模型,在java 中每个线程都有自己的工作内存,如寄存器,高速缓存等,线程在写入的时候首先写入的是自己的工作内存中,然后在刷到主内存中,读取也是先从主内存加载到工作内存中,然后线程是从工作内存中获取。 volatile 只能保证每次读写数据的时候都是对主内存进行操作,但是并不能保证该资源的同步。 /** * * @author ...2014-10-22 23:07:39 · 361 阅读 · 0 评论 -
ForkJoinPool 学习示例
在JAVA7之前,并行处理数据非常麻烦。第一,你得明确把包含数据的数据结构分成若干份。第二,你要将每个子部分分配给一个独立的线程。第三,你要在恰当的时候对它们进行同步避免不希望的竞争条件,等待所有线程完成,最后把这些部分结果合并起来。在Java 7引入了分支/合并框架,让这些操作更稳定、更不容易出错。 分支/合并框架的目的是以递归的方式将可以并行的任务拆分为更小...2016-07-07 10:59:56 · 408 阅读 · 0 评论 -
Java 之ThreadPoolExecutor.RejectedExecutionHandler
ThreadPoolExecutor.AbortPolicy()抛出java.util.concurrent.RejectedExecutionException异常 终止策略是默认的饱和策略;ThreadPoolExecutor.CallerRunsPolicy()当抛出RejectedExecutionException异常时,会调rejectedExecution方法 ...2015-01-21 21:14:48 · 422 阅读 · 0 评论