在 Java 的并发编程中,`synchronized` 关键字是一种简单且常用的同步方法。它是 Java 提供的一种原生的互斥机制,保证同一时刻最多只有一个线程执行该代码段,避免出现线程安全问题。本文将通过实例来详解其用法和原理。
首先,`synchronized` 关键字可以用于修饰方法或者代码块,其用法如下:
```java
// 同步方法
public synchronized void syncMethod() {
// ...
}
// 同步代码块
public void method() {
synchronized(this) {
// ...
}
}
```
在方法级别,`synchronized` 修饰符可以直接加在方法声明上,表示整个方法在执行时都需要获取该方法所在对象的锁。对于静态方法,获取的是类的锁。在代码块级别,`synchronized` 后面的括号中可以是任何对象,表示获取该对象的锁。
那么这里涉及的“锁”是什么呢?在 Java 中,每个对象都有一个内置锁(或称监视器锁)。当一个线程获取了对象的内置锁后,其他试图获取同一个对象内置锁的线程将会被阻塞,直到第一个线程释放锁。
下面是一个简单的例子来演示其效果:
```java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
```
在这个例子中,我们定义了一个线程安全的计数器。因为 `increment` 方法和 `getCount` 方法都被 `synchronized` 修饰,所以当多线程并发访问这个计数器时,我们可以确保 `count` 的值始终是正确的。
尽管 `synchronized` 在某些情况下可能会引入性能开销,但其简单明了的语义使得它在并发编程中仍然是一个非常有用的工具。