【锁synchronized】在Java多线程编程中,`synchronized` 是一个非常重要的关键字,用于控制对共享资源的访问,防止多个线程同时修改共享数据导致的数据不一致问题。它通过提供一种“锁”的机制,确保同一时间只有一个线程可以执行某个代码块或方法。
一、synchronized 的基本作用
`synchronized` 可以用于以下几种场景:
使用方式 | 说明 |
方法级别 | 对整个方法加锁,保证同一时间只有一个线程可以调用该方法 |
代码块级别 | 对特定的代码块加锁,粒度更细,提高并发性能 |
静态方法 | 对类的静态方法加锁,锁的是类对象(Class对象) |
实例方法 | 对实例方法加锁,锁的是当前实例对象 |
二、synchronized 的工作原理
1. 进入锁机制:当一个线程尝试进入被 `synchronized` 修饰的代码块或方法时,会尝试获取对应的锁。
2. 获取锁成功:如果当前没有其他线程持有该锁,线程将获得锁并继续执行。
3. 获取锁失败:如果锁已被其他线程持有,当前线程会被阻塞,直到锁被释放。
4. 释放锁:线程执行完同步代码块后,会自动释放锁,其他等待的线程可以继续竞争。
三、synchronized 的优缺点
优点 | 缺点 |
简单易用,适合基础的线程同步需求 | 性能较低,不适合高并发场景 |
提供了原子性和可见性保障 | 锁粒度大,可能导致线程阻塞和死锁 |
支持多种加锁方式(方法/代码块) | 不支持尝试获取锁、超时等高级功能 |
四、synchronized 的使用示例
示例1:方法级别的同步
```java
public synchronized void add() {
count++;
}
```
示例2:代码块级别的同步
```java
public void add() {
synchronized (this) {
count++;
}
}
```
示例3:静态方法的同步
```java
public static synchronized void staticAdd() {
count++;
}
```
五、总结
`synchronized` 是Java中最基础也是最常用的线程同步机制,适用于大多数简单的并发控制场景。虽然它的性能不如 `ReentrantLock` 等更高级的锁机制,但其语法简单、易于理解,是初学者入门多线程编程的首选工具。
在实际开发中,应根据业务需求选择合适的锁机制,合理控制锁的粒度,避免不必要的性能损耗和死锁风险。