你作为一个Java领域的专家,请完成以下任务:synchronized作用在类、方法、代码块区别?
时间: 2023-12-03 21:42:36 浏览: 94
java中synchronized(同步代码块和同步方法)详解及区别
5星 · 资源好评率100%
synchronized 是 Java 中用于实现线程同步的关键字。它可以用在类、方法和代码块上,作用分别如下:
1. synchronized 作用在类上:锁定的是该类的 Class 对象。
```java
public class MyClass {
public static synchronized void myMethod() {
// ...
}
}
```
在这个例子中,myMethod() 方法是静态的,使用 synchronized 关键字修饰,表示该方法在调用时会锁定 MyClass 类的 Class 对象。因为 Class 对象在 JVM 中只有一份,所以该方法被多个线程同时调用时,只有一个线程能够获得锁,其他线程需要等待。
2. synchronized 作用在方法上:锁定的是该方法所属的对象实例。
```java
public class MyClass {
public synchronized void myMethod() {
// ...
}
}
```
在这个例子中,myMethod() 方法是实例方法,使用 synchronized 关键字修饰,表示该方法在调用时会锁定该方法所属的对象实例。因为每个对象实例在 JVM 中都有自己的锁,所以该方法被多个线程同时调用时,每个线程会锁定自己所属的对象实例,因此不会产生冲突。
3. synchronized 作用在代码块上:锁定的是该代码块所属的对象实例。
```java
public class MyClass {
public void myMethod() {
synchronized (this) {
// ...
}
}
}
```
在这个例子中,使用 synchronized 关键字修饰了一个代码块,该代码块所属的对象实例就是 this。因为每个对象实例在 JVM 中都有自己的锁,所以该代码块被多个线程同时执行时,每个线程会锁定自己所属的对象实例,因此不会产生冲突。
总结来说,synchronized 关键字可以用于类、方法和代码块上,它们的作用分别是锁定类的 Class 对象、锁定方法所属的对象实例和锁定代码块所属的对象实例。根据具体的应用场景,选择不同的锁定方式可以更好地实现线程同步。
阅读全文