在Java中,`synchronized`关键字用于控制对共享资源的并发访问,它可以用来保证线程之间的同步,防止多个线程同时访问同一资源造成的数据不一致性问题。
`Synchronized`可以用在方法上或者代码块上:
1. **Synchronized方法:**如果你声明一个方法为`synchronized`,那么它会锁定调用该方法的对象。如果一个线程在对象上执行一个`synchronized`方法,其他所有线程试图在同一个对象上调用任何其他`synchronized`方法时将会被阻塞,直到第一个线程完成任务。
2. **Synchronized代码块:**相比方法锁,代码块锁更加细粒度,它允许锁定任何对象,而不仅仅是方法调用的对象。这意味着如果一个线程进入一个对象的一个`synchronized`代码块,其他线程仍然可以访问该对象的非synchronized代码区域。
`synchronized`工作原理基于内部锁或监视器锁。当线程进入一个`synchronized`方法或代码块时,它会自动获取锁,当线程退出`synchronized`方法或代码块时,它会自动释放锁,无论是通过正常路径返回还是通过抛出异常退出。其他线程则需要等待直到锁被释放。
**示例:**
```java
public class Counter {
private int count = 0;
// 使用synchronized方法
public synchronized void increment() {
count++; // 当一个线程执行这个方法时,其他线程必须等待
}
// 使用synchronized代码块
public void incrementBlock() {
synchronized(this) {
count++; // 只有获取了这个对象锁的线程才能执行这个代码块
}
}
public int getCount() {
return count;
}
}
```
在这个示例中,`increment`方法和`incrementBlock`方法都保证了当多个线程尝试更新`count`变量时,每次只有一个线程可以执行增加操作,从而确保了线程安全。
总结,`synchronized`关键字是实现同步的一种手段,它帮助开发者控制对共享资源的并发访问,是Java并发编程中的基础。