AQS和Synchronized
2020-07-03 18:00:40 20 举报
lock
作者其他创作
大纲/内容
displaced MarkWord
lock rocord
head node
Condition notEmpty = lock.newCondition();
MonitorObject
将挂起线程,吧线程 放入等待对队列
_EntryList 阻塞队列
对齐填充
是,锁重入
singal()
否
_WaitSet等待队列
Class
wait()
klass word类型指针在64位jvm里暂用了大量内存,jvm默认是开启指针压缩参数的
实例数据
获取锁后执行如下操作head nodenotEmpty.await()
轻量级锁MarkWord中的指针指向栈中的lockRecord
是,获取锁
否,进行旋获取锁
array length数组对象保存数组长度
_owner指向自己的线程
Lock lock = new ReentrantLock();lock.lock();try { ... }finally { lock.unlock();}
owner
this对象
MarkWord如果是偏向锁,则直接将线程id保存在MarkWord里
每个线程加锁的动作就是修改state的值,如果是独占锁就是从0变成1;共享锁的话就是累加state
对象头
displaced保存的是获取锁之前对象的MarkWord,因为MarkWord里的需要存放对象指针所以把hashcode等信息保存起来,锁释放后把数据还回去
node
是否owner为空
notify/notifyall
指向类的元数据
线程栈
Waiter
锁释放后尝试获取
AQS和Synchronized底层原理差不多,思想都是对挂起线程进行管理
firstWaiter
是否是当前线程
volatile int state;
synchronized(this){}
通过CAS对state进行赋值操作,如果成功则获得锁,如果失败则会把当前线程封装成node,放入阻塞队列,并挂起线程
lastWaiter
tail node
当锁升级为重量级锁时MarkWork中指针指向Monitor对象
多次自旋仍未获取锁仍进等待队列,线程挂起
AQS同步器
0 条评论
下一页