synchronized 关键字锁定的对象是什么?请解释其含义。
synchronized
在Java中主要有三种用法,它锁的对象根据用法的不同有所不同:
- 修饰实例方法:当
synchronized
修饰实例方法时,它锁的是调用该方法的对象实例。这意味着每个实例都有自己的一把锁,不同实例之间的锁是互不干扰的。同一时间只有一个线程能访问该对象的synchronized
方法,其他试图访问该对象synchronized
方法的线程将会被阻塞,直到锁被释放。
public class MyClass {
public synchronized void method() {
// ...
}
}
- 修饰静态方法:当
synchronized
修饰静态方法时,它锁的是这个类的所有对象(类锁)。也就是说,同一时间只有一个线程能访问这个类的任意一个synchronized
静态方法。
public class MyClass {
public static synchronized void method() {
// ...
}
}
- 修饰代码块:当
synchronized
修饰代码块时,必须指定一个锁对象,同一时间只有一个线程能访问这个代码块。这个锁对象可以是任何对象,但是通常我们会使用一个专门的锁对象,或者是直接使用被保护的资源作为锁对象。
public class MyClass {
private Object lock = new Object();
public void method() {
synchronized(lock) {
// ...
}
}
}
总的来说,synchronized
锁的就是一个对象,这个对象可以是实例对象、类对象或者是任意对象。