当前位置:首页 > 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确保变量的可见性,但不保证原子性。适用于一写多读的场景。

java如何控制并发

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),避免显式同步。

java如何控制并发

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为每个线程提供独立的变量副本,避免共享变量的问题。

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

打开 Java 程序的方法 通过命令行运行 Java 程序 确保已安装 Java Development Kit (JDK) 并配置环境变量。使用 javac 编译 .java 文件,生成 .clas…

java如何自学

java如何自学

确定学习目标和路径 自学Java需要明确目标,例如开发Web应用、Android应用或后端服务。根据目标选择学习重点,如Java基础、Spring框架或Android开发。制定阶段性计划,从基础语法到…

如何编写java程序

如何编写java程序

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

java如何打印数组

java如何打印数组

打印数组的方法 在Java中,打印数组有多种方式,以下是几种常见的方法: 使用Arrays.toString()方法 这种方法适用于一维数组,可以快速将数组转换为字符串形式输出: int[] a…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

如何阅读java源码

如何阅读java源码

阅读Java源码的方法 选择合适的源码项目 初学者建议从JDK核心类库(如java.lang、java.util)或知名开源项目(如Spring、Guava)入手。选择文档完善、社区活跃的项目能降低理…