Synchronized可以作用在哪里? 分别通过对象锁和类锁进行举例。
时间: 2024-02-05 21:11:55 浏览: 30
Synchronized 是 Java 中用于实现同步的关键字,它可以作用于方法、代码块和静态方法上。
对象锁示例:
```java
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public void performWork() {
synchronized (this) {
// 代码块
increment();
}
}
}
```
在上面的示例中,`increment` 方法使用了对象锁,使得同一时刻只有一个线程可以访问该方法。`performWork` 方法使用了代码块的对象锁,同样使得同一时刻只有一个线程可以执行代码块内的代码。
类锁示例:
```java
public class SynchronizedExample {
private static int count = 0;
public static synchronized void increment() {
count++;
}
public static void performWork() {
synchronized (SynchronizedExample.class) {
// 代码块
increment();
}
}
}
```
在上面的示例中,`increment` 方法使用了类锁,使得同一时刻只有一个线程可以访问该方法。`performWork` 方法使用了代码块的类锁,同样使得同一时刻只有一个线程可以执行代码块内的代码。
需要注意的是,对象锁和类锁的作用范围是不同的,对象锁是针对实例对象的,而类锁是针对类的。当多个线程同时访问同一实例对象的对象锁时,它们之间会互斥,但是当多个线程同时访问不同实例对象的对象锁时,它们之间不会互斥。类锁则是针对整个类的,当多个线程同时访问该类的类锁时,它们之间会互斥。