synchronized 关键字锁定的对象是什么?请解释其含义。

synchronized在Java中主要有三种用法,它锁的对象根据用法的不同有所不同:

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

    public void method() {
        synchronized(lock) {
            // ...
        }
    }
}

总的来说,synchronized锁的就是一个对象,这个对象可以是实例对象、类对象或者是任意对象。

发表评论

后才能评论