程序员

synchrozied

2020-07-05  本文已影响0人  尉昌达

java中的每个对象都可以作为锁,(不要用String,Integer,Long),当synchrozied 在不同位置,锁的对象不一样:

  1. 普通同步方法,锁是当前实例对象
  2. 静态同步方法,锁是当前类的class对象
  3. 同步代码块,锁是括号中的对象

在hospot中synchronized是看对象头的前2位来判断是否有锁。

程序在执行过程中,如果出现异常,默认情况锁会被释放

synchronized的底层实现

JDK早期的synchronized是 重量级的 - OS系统锁
后来改进:

sync (Object)的时候,

  1. 一开始 markword 记录这个线程ID (偏向锁),如果下次还是当前线程来访问,就可以直接进入了,不用加锁,提高效率。

  2. 如果出现线程争用:再升级为 自旋锁,这个过程是占用cpu的,在用户态

  3. 自旋10次以后,升级为重量级锁 - OS系统锁, 内核态,进入等待队列,就不占用cpu了

这个锁只能升级,不能降级。

上一篇 下一篇

猜你喜欢

热点阅读