线程系列 4 - synchronized 和线程间的通信
发布人:shili8
发布时间:2025-03-01 00:46
阅读次数:0
**线程系列4 - synchronized 和线程间的通信**
在前面的文章中,我们已经学习了线程的基本概念、创建线程的方法以及线程的生命周期。然而,在多线程编程中,一个非常重要的问题是如何让不同的线程之间进行通信和同步。
**1. synchronized**
`synchronized` 是 Java 中的一个关键字,它可以用来修饰一个方法或一个代码块,使得在同一时间内,只有一个线程能够执行这个方法或代码块。这种机制可以防止多个线程同时访问共享资源,从而避免了数据的不一致性。
**1.1 synchronized 的使用**
下面是一个简单的例子,演示了 `synchronized` 的使用:
javapublic class SynchronizedExample { private int count =0; public void increment() { synchronized (this) { // synchronized this count++; } } public int getCount() { return count; } }
在这个例子中,`increment()` 方法使用 `synchronized` 修饰符,这意味着每次只有一个线程能够执行这个方法。由于 `count` 是一个共享资源,因此使用 `synchronized` 可以保证 `count` 的值是正确的。
**1.2 synchronized 的实现**
`synchronized` 的实现基于 Java 中的锁机制。在 Java 中,每个对象都有一个内置的锁,称为 `monitor`。当你在一个方法或代码块上使用 `synchronized` 修饰符时,它会获得这个对象的锁,从而阻止其他线程进入这个方法或代码块。
下面是一个简单的例子,演示了 `synchronized` 的实现:
javapublic class SynchronizedExample { private Object lock = new Object(); public void increment() { synchronized (lock) { // synchronized lock System.out.println("Thread " + Thread.currentThread().getName() + " is executing..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread " + Thread.currentThread().getName() + " finished."); } } public static void main(String[] args) { SynchronizedExample example = new SynchronizedExample(); Thread thread1 = new Thread(() -> example.increment()); Thread thread2 = new Thread(() -> example.increment()); thread1.start(); thread2.start(); } }
在这个例子中,我们使用 `synchronized` 修饰符来保护一个方法,这个方法会睡眠1000 毫秒。由于只有一个线程能够执行这个方法,因此我们可以看到两个线程之间的切换。
**2. 线程间的通信**
线程间的通信是指让不同的线程之间进行信息交换和同步。在 Java 中,有几种方式可以实现线程间的通信:
* **wait() 和 notify()**: 这两个方法可以用来使一个线程等待另一个线程的通知。
* **Lock**: Lock 是 Java 中的一个接口,它提供了更细粒度的锁机制,可以用来保护共享资源。
* **Condition**: Condition 是 Java 中的一个接口,它提供了一种方式让一个线程等待另一个线程的条件。
下面是一个简单的例子,演示了 `wait()` 和 `notify()` 的使用:
javapublic class WaitAndNotifyExample { private boolean flag = false; public void waitMethod() { synchronized (this) { // synchronized this while (!flag) { try { this.wait(); // wait for notification } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread " + Thread.currentThread().getName() + " is notified."); } } public void notifyMethod() { synchronized (this) { // synchronized this flag = true; this.notify(); // notify the waiting thread } } public static void main(String[] args) { WaitAndNotifyExample example = new WaitAndNotifyExample(); Thread thread1 = new Thread(() -> example.waitMethod()); Thread thread2 = new Thread(() -> example.notifyMethod()); thread1.start(); thread2.start(); } }
在这个例子中,我们使用 `wait()` 和 `notify()` 方法来使一个线程等待另一个线程的通知。
**3. 总结**
在本文中,我们学习了 Java 中的 `synchronized` 关键字和线程间的通信。我们了解了 `synchronized` 的实现机制以及它如何保护共享资源。我们还学习了 `wait()` 和 `notify()` 方法,以及它们如何使一个线程等待另一个线程的通知。
通过阅读本文,希望你能够理解 Java 中多线程编程的基本概念,并能够使用 `synchronized` 和线程间的通信来保护共享资源和实现线程间的信息交换。