美文网首页
synchronized原理

synchronized原理

作者: defy_1203 | 来源:发表于2019-12-27 12:17 被阅读0次

synchronized可以用在静态方法,实例方法和代码块上。分别锁的是类对应,实例对象,object实例。

一个对象包括对象头、实例变量和填充数据。锁状态就存储在对象头,对象头有两个字节,分别存储着hashcode(25),年代信息(4),是否是偏向锁(1),锁标识(2)。

当一个线程过得锁后,锁标识改为偏向锁。当同一个线程再次请求锁时,可以直接进入临界区,而不需要等待。

当一个线程请求偏向锁失败(偏向锁指向另一个线程,但并没有被占用),此时会升级为轻量级锁。轻量级锁适合于线程间交替执行的情况。当一个线程抢占另一个线程正在持有的锁,就会升级为重量级锁。

在升级重量级锁之前,让线程等待一段时间(空跑几十次),不会立即挂起,称为自旋锁。因为线程的挂起和唤醒会伴随着线程用户态和内核态切换,这是和耗时的操作。所以当一个线程在抢占锁失败时,先进入自旋锁。

自旋锁适合持有锁的线程很快释放锁的情况,否则就是白白浪费CPU,所以自旋锁的空跑次数要有限制,一般是50次或100次。当持有锁的线程仍不能释放锁,将会升级到重量级锁。

锁的升级过程是不可逆的。在jdk1.6以前,synchronized锁直接就是重量级锁。1.6优化增加了偏向锁 轻量级锁 自旋锁等。

一个加锁对应会同时分配一个monitor对象(管程)。monitor里记录着请求线程的队列,就绪线程的队列,和阻塞线程的队列。

相关文章

网友评论

      本文标题:synchronized原理

      本文链接:https://www.haomeiwen.com/subject/upbdvctx.html