在 Java 中,线程间的同步和通信是确保多线程程序正确运行的关键。以下是一些常用的方法和示例:
### 线程同步
线程同步用于防止多个线程同时访问共享资源,从而避免数据不一致的问题。Java 提供了 `synchronized` 关键字来实现同步。
#### 同步方法
使用 `synchronized` 关键字修饰方法,确保同一时间只有一个线程可以执行该方法。
```java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
```
#### 同步块
使用 `synchronized` 关键字修饰代码块,可以更细粒度地控制同步范围。
```java
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
public int getCount() {
synchronized (lock) {
return count;
}
}
}
```
### 线程通信
线程通信用于在多个线程之间传递信息。Java 提供了 `wait()`、`notify()` 和 `notifyAll()` 方法来实现线程通信。
#### 示例代码
以下是一个生产者-消费者模型的示例,展示了如何使用 `wait()` 和 `notify()` 方法进行线程通信。
```java
class SharedResource {
private boolean flag = false;
public synchronized void produce() {
while (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Producing...");
flag = true;
notify();
}
public synchronized void consume() {
while (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Consuming...");
flag = false;
notify();
}
}
public class ThreadCommunication {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Thread producer = new Thread(resource::produce);
Thread consumer = new Thread(resource::consume);
producer.start();
consumer.start();
}
}
```
通过这些方法,Java 程序可以实现线程间的同步和通信,确保多线程程序的正确性和效率。