[TOC]一、概述ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。相对于 synchronized 它具备如下特点:可中断synchronized锁加上去不能中断,a线程应用锁,b线程不能取消掉它可以设置超时时间synchronized它去获取锁时,如果对方持有锁,那么它就...
[TOC]一、死锁死锁产生的四个必要条件互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。死锁示例有这样的情况:一个线程需要同时获取多把锁,这时就容易发...
[TOC]一、背景介绍现在有一个房子,在房子中有卧室和书房:书房可以用来学习卧室可以用来睡觉但是学习和睡觉两件事不冲突,不过学习和学习会出现冲突,睡觉和睡觉之间存在冲突。二、示例当整个房子只有一把锁时现在t1线程要获取锁进房间学习,t2线程要进房间睡觉import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date ...
[TOC]一、概念LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。park,unpark这两个方法都是LockSupport类名下的方法,park用来暂停线程,unpark用来将暂停的线程恢复。先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是...
[TOC]一、基本概念保护性暂停(Guarded Suspension):用在一个线程等待另一个线程的执行结果时使用。保护性暂停的暂停就是当条件不满足的时候就去进行wait等待。要点有一个结果需要从一个线程传递到另一个线程,让它们关联同一个GuardedObject。如果有结果不断从一个线程到另一个线程那么此时就不能使用这个保护性暂停模式了,可以使用消息队列(见生产者/消费者)。JDK中,j...
[TOC]一、原理分析Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片BLOCKED 线程会在 Owner 线程释放锁时唤醒WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入...
[TOC]一、偏向锁概念轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS操作。Java 6中引入了偏向锁来做进一步优化:只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。以后只要不发生竞争,这个对象就归该线程所有。升级为轻量级锁的情况 (会进行偏向锁撤销) : 获取偏向锁的时候, 发现线程ID不是自...
[TOC]一、轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以 使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized示例假设有两个方法同步块,利用同一个对象加锁static final Object obj = new Object(); public static void method1() { ...
[TOC]一、Java对象头HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机的对象头包括三部分信息:Mark Word指向类的指针数组长度普通对象以 32 位虚拟机为例Klass Word:指向对象的类型(一个指针找到它的类对象)一个int 类型占4个字节,而一个I...