什么是 Java 中的线程同步?

Sherwin.Wei Lv7

什么是 Java 中的线程同步?

回答重点

线程同步是指在多线程环境下,为了避免多个线程对共享资源进行同时访问,从而引发数据不一致或其他问题的一种机制。它通过对关键代码段加锁,使得同一时刻只有一个线程能够访问共享资源。

当多个线程共享同一资源(如变量、对象或文件)时,若没有同步机制,可能会导致竞态条件,即线程对共享资源的操作是非原子性的,多个线程之间可能会同时修改数据,导致结果不符合预期。

扩展知识

Java 中常见的同步方式

synchronized

Java 提供的加锁关键字,用于在方法或代码块上加锁,以确保同一时刻只有一个线程能够执行被同步的方法或代码块。

在 synchronized 可以使用 wait()、notify() 和 notifyAll() 实现条件等待通知。

  • wait():当前线程进入等待状态,直到被其他线程唤醒。必须在同步块或同步方法中调用。
  • notify():唤醒一个等待的线程。如果有多个线程在等待,同一时刻只能唤醒一个。
  • notifyAll():唤醒所有等待的线程。

例如在 synchronized 块或方法中,可以使用 wait() 方法使线程等待某个条件满足,可使用 notify() 或 notifyAll() 方法唤醒等待的线程。

ReentrantLock

是 JUC (java.util.concurrent)提供的可重入锁,相比 synchronized 它更加灵活,

ReentrantLock 使用 Condition 对象来提供了更灵活的等待/通知机制。每个 ReentrantLock 可以创建一个或多个 Condition 对象,通过 newCondition() 方法创建。

  • await():使当前线程等待,直到收到信号或被中断。
  • signal():唤醒一个等待线程。
  • signalAll():唤醒所有等待线程。

相比于 synchronized,ReentrantLock 还提供了公平锁和非公平锁机制。

JUC 其他同步工具类

Java 提供了一些高级的并发工具类,如 CountDownLatch、CyclicBarrier、Semaphore 等,它用于实现一些复杂的同步需求。

synchronized 和 ReentrantLock 的比较

Comments