并发编程-synchronized

synchronized锁什么?

 锁对象,可能包括:this, 临界资源对象,class类对象

锁的底层实现

同步代码块基于monitor enter和monitor exit指令实现同步,

同步方法基于读取运行时常量池中方法的ACC_SYNCHRONIZED标志来隐式实现。

对象内存的组成

对象头:存储对象的hashcode\锁信息\GC信息\类型指针

实例变量

填充数据:虚拟机要求对象的起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅为了字节对齐。

执行过程

当执行synchronized同步方法或同步代码块时,会在对象头中记录锁标记,锁标记指向monitor对象的起始地址。

monotor对象:每个对象都存在一个monitor与之关联,monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成。当monitor对象被某个线程持有后,便处于锁定状态

monitor是由ObjectMonotor实现的。ObjectMonitor中包括:_owner标记,两个队列,_waitSet\_entryList

所线程并发访问同一个同步代码时,首先进入_entryList, 当线程获取锁标记后,_owner记录此线程,且在monitor中的计数器执行+1操作代表锁定。其他线程在_entryList中继续阻塞。

如果执行线程调用wait方法,则monitor中的计数器置为0,_owner置为null,代表放弃锁,执行线程进入waitset中阻塞。

如果执行线程调用notify\notifyAll,_waitset中的线程被唤醒,进入_entryList中阻塞,等待获取锁标记。

如果执行线程的同步代码执行结束,会释放锁标记,monitor中的计数器置为0,_owner置为null

猜你喜欢

转载自www.cnblogs.com/yintingting/p/11424306.html