synchronized 关键字作为同步锁时有哪些用法?请举例说明。

在Java中,synchronized关键字主要有三种用法,分别可以修饰方法、代码块以及静态方法或静态代码块:

  1. 修饰普通方法:当synchronized修饰普通方法时,锁是当前实例对象。同一时间只有一个线程能够进入该方法,其他线程必须等待。
public class MyClass {
    public synchronized void method() {
        // ...
    }
}
  1. 修饰代码块:synchronized可以修饰代码块,此时需要指定一个锁对象。在同一时刻,只有一个线程能够进入该代码块,其他线程必须等待。
public class MyClass {
    private Object lock = new Object();

    public void method() {
        synchronized(lock) {
            // ...
        }
    }
}
  1. 修饰静态方法或静态代码块:当synchronized修饰静态方法或静态代码块时,锁是当前类的Class对象。在同一时刻,只有一个线程能够进入该静态方法或静态代码块,其他线程必须等待。
public class MyClass {
    public static synchronized void method() {
        // ...
    }
}

或者

public class MyClass {
    static {
        synchronized(MyClass.class) {
            // ...
        }
    }
}

需要注意的是,无论synchronized修饰的是方法、代码块还是静态方法,它控制的都是同一时刻只有一个线程能够访问同步资源。同时,synchronized具有可重入性,即一个线程可以对同一个对象多次加锁。

发表评论

后才能评论