当前位置:首页 > Java

java如何实现多线程同步

2026-03-17 18:25:32Java

Java 多线程同步的实现方法

Java 提供了多种机制来实现多线程同步,确保线程安全。以下是常见的实现方式:

synchronized 关键字

synchronized 可以修饰方法或代码块,确保同一时间只有一个线程可以访问被保护的资源。

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

ReentrantLock

ReentrantLockjava.util.concurrent.locks 包中的类,提供了比 synchronized 更灵活的锁机制。

java如何实现多线程同步

import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private int count = 0;
    private ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

volatile 关键字

volatile 确保变量的可见性,但不保证原子性。适用于简单的状态标志。

public class VolatileExample {
    private volatile boolean flag = false;

    public void toggleFlag() {
        flag = !flag;
    }
}

Atomic 类

java.util.concurrent.atomic 包提供了原子类(如 AtomicInteger),适合计数器等场景。

java如何实现多线程同步

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }
}

CountDownLatch

CountDownLatch 允许一个或多个线程等待其他线程完成操作。

import java.util.concurrent.CountDownLatch;

public class Worker implements Runnable {
    private final CountDownLatch latch;

    public Worker(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        // 执行任务
        latch.countDown();
    }
}

Semaphore

Semaphore 控制同时访问特定资源的线程数量。

import java.util.concurrent.Semaphore;

public class ResourcePool {
    private Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问

    public void accessResource() {
        try {
            semaphore.acquire();
            // 访问资源
        } finally {
            semaphore.release();
        }
    }
}

CyclicBarrier

CyclicBarrier 让一组线程互相等待,到达屏障点后再继续执行。

import java.util.concurrent.CyclicBarrier;

public class Task implements Runnable {
    private CyclicBarrier barrier;

    public Task(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    @Override
    public void run() {
        // 执行任务
        barrier.await(); // 等待其他线程
    }
}

选择同步方法的建议

  • 简单同步需求使用 synchronized
  • 需要更灵活的锁控制时使用 ReentrantLock
  • 状态标志使用 volatile
  • 计数器等场景使用原子类。
  • 线程间协作使用 CountDownLatchSemaphoreCyclicBarrier

分享给朋友:

相关文章

vue如何实现滤镜

vue如何实现滤镜

Vue 实现滤镜的方法 在 Vue 中实现滤镜效果可以通过多种方式,以下是常见的几种方法: 使用 CSS filter 属性 通过 CSS 的 filter 属性可以直接为元素添加滤镜效果。在 Vu…

vue如何实现单选

vue如何实现单选

使用原生 HTML 单选按钮 在 Vue 中可以直接使用 HTML 的原生单选按钮,通过 v-model 绑定数据。 <template> <div> <…

前段vue如何实现

前段vue如何实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的 Vue 实现方法: 组件化开发 Vue 的核心思想是组件化开发。每个组件可以独立封装逻辑、模板和样式,便于复用…

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…

vue如何实现录音

vue如何实现录音

使用Web Audio API实现录音 在Vue中实现录音功能可以通过Web Audio API结合MediaRecorder API来完成。以下是一个基础实现方案: 安装必要的依赖: npm i…

vue如何实现图

vue如何实现图

Vue 实现图表的方法 Vue 中实现图表可以通过多种方式,常见的有使用第三方库或自定义实现。以下是几种常见的方法: 使用 ECharts ECharts 是一个功能强大的图表库,支持多种图表类型。…