当前位置:首页 > synchronized > 正文

synchronized锁的是什么

概念 解释 synchronized锁定的对象
synchronized关键字修饰的代码块或方法,它锁定的是对象,而不是代码块或方法本身。
锁定的范围

  • 方法锁: 当synchronized修饰一个方法时,锁定的对象是当前方法所属的对象实例。 如果该方法是静态方法,则锁定的对象是当前类的Class对象。

  • 代码块锁: 当synchronized修饰一个代码块时,锁定的对象是括号内指定的对象引用。 例如: synchronized(this){...} 锁定的对象是当前实例。


锁的机制

  • 每个对象都拥有一个内部锁(monitor)。 当线程执行到synchronized代码块或方法时,会尝试获取该对象的内部锁。

  • 如果获取成功,该线程就可以执行synchronized代码块或方法,并且其他线程无法获取该对象的锁,即其他线程会被阻塞。

  • 当该线程执行完synchronized代码块或方法后,会释放该对象的锁,其他线程就可以继续尝试获取该对象的锁。


锁的类型

  • 偏向锁: 在多线程竞争情况下,如果只有一个线程访问该对象,则会使用偏向锁,性能更高。

  • 轻量级锁: 当多个线程竞争该对象时,如果竞争不太激烈,则会使用轻量级锁,性能比偏向锁稍差,但比重量级锁性能好。

  • 重量级锁: 当竞争非常激烈时,则会使用重量级锁,性能最低,但能保证线程安全。