Java中synchronized如何使用,在普通方法上和加在静态方法上的区别
时间: 2024-09-22 15:01:02 浏览: 43
Java中synchronized实现原理详解
5星 · 资源好评率100%
在Java中,`synchronized`关键字用于控制线程对共享资源的访问,防止多个线程同时修改数据导致的数据不一致性。它有两种基本的使用形式:
1. **同步普通方法**:
- 放在方法声明前:如果在一个类的所有实例方法上应用`synchronized`,那么这个类的所有实例将互斥地访问该方法。例如:
```java
public class Counter {
private int count;
synchronized void increment() {
count++;
}
}
```
- 放在方法体内部:可以指定特定的对象作为锁,这样只有拥有该对象监视器的线程才能进入方法。例如:
```java
private Object lock = new Object();
public synchronized void increment() {
// 使用lock对象作为锁
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
```
2. **同步静态方法**:
- 直接在静态方法前使用`synchronized`: 只有在同一时刻,只有一个线程能执行这个静态方法。因为静态方法无所属的对象,所以锁就是当前的类对象。
```java
public static synchronized void sharedStaticMethod() {
// ...
}
```
- 注意:静态方法不能操作非静态成员变量,因为静态方法不存在类的实例上下文。
**区别**:
- 普通方法上的`synchronized`基于实例,意味着每个实例有自己的锁,所以可以访问类的非静态成员变量。
- 静态方法上的`synchronized`基于类,所有实例共享同一把锁,适用于不需要访问实例状态的情况,或者需要在整个类范围内保持互斥。
阅读全文