当前位置:首页 > Java

java如何控制并发

2026-02-05 12:28:55Java

控制并发的常见方法

在Java中控制并发主要通过以下几种机制实现,确保多线程环境下的数据安全和性能优化。

使用synchronized关键字

synchronized是最基础的线程同步机制,可以修饰方法或代码块,确保同一时间只有一个线程访问共享资源。

public class Counter {
    private int count = 0;

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

使用ReentrantLock

ReentrantLockjava.util.concurrent.locks包中的显式锁,提供比synchronized更灵活的锁控制,支持公平锁和可中断锁。

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 SharedResource {
    private volatile boolean flag = false;

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

使用原子类(AtomicInteger等)

java.util.concurrent.atomic包提供原子类(如AtomicInteger),通过CAS(Compare-And-Swap)实现无锁线程安全操作。

import java.util.concurrent.atomic.AtomicInteger;

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

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

使用并发集合

Java提供线程安全的并发集合(如ConcurrentHashMapCopyOnWriteArrayList),避免显式同步。

import java.util.concurrent.ConcurrentHashMap;

public class Cache {
    private ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();

    public void put(String key, String value) {
        map.put(key, value);
    }
}

使用CountDownLatchCyclicBarrier

CountDownLatchCyclicBarrier用于协调多个线程的执行顺序。

import java.util.concurrent.CountDownLatch;

public class TaskRunner {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);

        new Thread(() -> {
            // 执行任务
            latch.countDown();
        }).start();

        latch.await(); // 等待所有任务完成
    }
}

使用Semaphore

Semaphore控制对共享资源的访问数量,适用于限流场景。

import java.util.concurrent.Semaphore;

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

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

使用ThreadLocal

ThreadLocal为每个线程提供独立的变量副本,避免共享变量的问题。

java如何控制并发

public class UserContext {
    private static ThreadLocal<String> user = new ThreadLocal<>();

    public static void setUser(String username) {
        user.set(username);
    }

    public static String getUser() {
        return user.get();
    }
}

选择依据

  • 简单同步:优先使用synchronizedReentrantLock
  • 高性能无锁:选择原子类或并发集合。
  • 线程协作:使用CountDownLatchCyclicBarrierSemaphore
  • 线程隔离:使用ThreadLocal

标签: java
分享给朋友:

相关文章

如何编写java程序

如何编写java程序

安装开发环境 下载并安装JDK(Java Development Kit),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME和PATH正确设置。 选…

如何运行java项目

如何运行java项目

运行Java项目的步骤 确保Java环境已安装 在运行Java项目前,需确认系统已安装Java Development Kit(JDK)。通过命令行输入java -version和javac -ver…

java如何入门

java如何入门

学习基础语法 从Java的基础语法开始,包括变量、数据类型、运算符、控制结构(if-else、for循环、while循环)等。可以通过官方文档或入门教程学习。 安装开发环境 下载并安装JDK(J…

java如何调用另一个类的方法

java如何调用另一个类的方法

调用另一个类的方法 在Java中调用另一个类的方法,通常需要创建该类的对象或直接通过类名调用(静态方法)。以下是几种常见的方式: 通过对象实例调用实例方法 创建一个目标类的对象,通过对象调用其方法。…

react如何与java配合

react如何与java配合

React 与 Java 配合的常见方式 React 作为前端框架,通常与 Java 后端通过 RESTful API 或 GraphQL 进行交互。以下是几种常见的配合方式: RESTful AP…

php 实现 java md5

php 实现 java md5

在 PHP 中实现与 Java 相同的 MD5 哈希算法,关键在于确保编码和输出格式的一致性。以下是具体实现方法和注意事项: 确保字符串编码一致 Java 的 String.getBytes() 默…