Synchronized锁流程图
2017-03-27 19:13:13 0 举报
在Java中,Synchronized锁的流程图主要包括以下几个步骤: 1. 当一个线程进入一个同步方法或同步代码块时,它会尝试获取对象的锁。 2. 如果对象没有被其他线程锁定,那么当前线程会成功获取到锁,然后执行同步代码块或同步方法中的代码。 3. 如果对象已经被其他线程锁定,那么当前线程会被阻塞,直到锁被释放。 4. 当线程执行完同步代码块或同步方法中的代码后,它会自动释放锁。 5. 如果线程在执行同步代码块或同步方法的过程中发生了异常,那么锁也会被释放。 这张流程图清晰地展示了Synchronized锁的工作原理和线程之间的交互过程。
作者其他创作
大纲/内容
是
线程monitor列表中的一个monitor
candidate唤醒阻塞候选线程
对象处于无锁状态,lockword的值为hashcode,状态为001,线程首先从monitor列表获取空闲monitor,初始化owner为线程唯一标识,nest为1,通过CAS替换monitor起始地址到lockword进行膨胀,
klass ptr 对象字节码指针
对象已经膨胀,同时owner指向别的线程,在调用OS的重量级互斥锁之前自旋一定次数,当达到一定次数,如果仍然没有获得锁,则开始准备进去阻塞状态,并将RcThis+1,由于在加1的过程中可能被其他线程破坏对象和monitor之间的关联,所以加1后再次判断lockword的值没有被改变
开始
对象已经膨胀,monitor的owner字段为null,此时多个线程通过CAS指令试图将owner设置为自己的标识已期获得锁,失败的,走后续流程
owner是否为null
阻塞
成功线程
lockword | 标记位
否
对象膨胀:即对象lockword字段原来为hashcode值,获取锁后备替换为monitor的起始地址,此过程即为对象膨胀
hashcode锁对象hash值
是否改变
Objec锁对象
重新进入monitorenter开始获取锁的过程,同时再次观察owner是否为null
markword
entryQ 关联互斥锁
失败线程
对象已经膨胀,monitor的owner指向当前线程,此时为重入锁,将nest+1,不需要CAS操作
RcThis阻塞或等待数
Fields
Nest锁重入数
owner
取得锁
monitor的owner字段是否为空
对象是否膨胀
0 条评论
下一页