什么是 Java 中的线程同步?
什么是 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