当前位置:首页 > 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的步骤 访问Oracle官方网站或OpenJDK项目页面下载Java开发工具包(JDK)。Oracle JDK适用于商业用途,OpenJDK为开源版本。 打开浏览器,进入Oracle…

如何删除java

如何删除java

卸载 Java 的步骤 Windows 系统: 打开控制面板,选择“程序和功能”或“卸载程序”,在列表中找到 Java 相关条目(如“Java Runtime Environment”或“Java D…

java如何编程

java如何编程

Java编程基础 Java是一种面向对象的编程语言,广泛应用于企业级开发、移动应用(Android)等领域。以下是Java编程的核心步骤和示例。 环境搭建 安装JDK 从Oracle官网下载适合…

java程序如何运行

java程序如何运行

编写Java代码 使用文本编辑器或IDE(如IntelliJ IDEA、Eclipse)编写Java源代码,保存为.java文件。例如: public class HelloWorld {…

如何自学java

如何自学java

选择合适的学习资源 从官方文档开始,Oracle提供的Java官方教程(Java Tutorials)是权威且免费的学习资料。在线平台如Codecademy、Coursera或Udemy提供互动式课程…

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…