概念 |
解释 | synchronized锁定的对象 |
synchronized关键字修饰的代码块或方法,它锁定的是对象,而不是代码块或方法本身。 | 锁定的范围 |
- 方法锁: 当synchronized修饰一个方法时,锁定的对象是当前方法所属的对象实例。 如果该方法是静态方法,则锁定的对象是当前类的Class对象。
- 代码块锁: 当synchronized修饰一个代码块时,锁定的对象是括号内指定的对象引用。 例如: synchronized(this){...} 锁定的对象是当前实例。
| 锁的机制 |
- 每个对象都拥有一个内部锁(monitor)。 当线程执行到synchronized代码块或方法时,会尝试获取该对象的内部锁。
- 如果获取成功,该线程就可以执行synchronized代码块或方法,并且其他线程无法获取该对象的锁,即其他线程会被阻塞。
- 当该线程执行完synchronized代码块或方法后,会释放该对象的锁,其他线程就可以继续尝试获取该对象的锁。
| 锁的类型 |
- 偏向锁: 在多线程竞争情况下,如果只有一个线程访问该对象,则会使用偏向锁,性能更高。
- 轻量级锁: 当多个线程竞争该对象时,如果竞争不太激烈,则会使用轻量级锁,性能比偏向锁稍差,但比重量级锁性能好。
- 重量级锁: 当竞争非常激烈时,则会使用重量级锁,性能最低,但能保证线程安全。
|