当前位置:首页 > Java

java并发如何控制

2026-03-22 15:45:09Java

控制Java并发的常见方法

使用synchronized关键字

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

public synchronized void increment() {
    count++; // 线程安全操作
}
public void increment() {
    synchronized(this) {
        count++; // 同步代码块
    }
}

使用ReentrantLock

ReentrantLock提供更灵活的锁控制,支持公平锁、可中断锁和超时锁。

private final ReentrantLock lock = new ReentrantLock();

public void increment() {
    lock.lock();
    try {
        count++;
    } finally {
        lock.unlock(); // 确保锁释放
    }
}

使用volatile关键字

volatile保证变量的可见性,但不保证原子性,适合单一变量的轻量级同步。

private volatile boolean flag = false;

使用原子类(AtomicInteger等)

java.util.concurrent.atomic包提供原子操作类,如AtomicInteger,适合无锁编程场景。

private AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet(); // 原子操作
}

使用CountDownLatch

CountDownLatch用于等待多个线程完成任务后再继续主线程。

CountDownLatch latch = new CountDownLatch(3);

// 线程完成任务后调用
latch.countDown();

// 主线程等待
latch.await();

使用CyclicBarrier

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

CyclicBarrier barrier = new CyclicBarrier(3, () -> {
    System.out.println("所有线程到达屏障");
});

// 线程调用
barrier.await();

使用Semaphore

Semaphore控制同时访问资源的线程数量,适合限流场景。

Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问

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

使用ThreadLocal

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

private static ThreadLocal<Integer> threadLocalCount = ThreadLocal.withInitial(() -> 0);

public void increment() {
    threadLocalCount.set(threadLocalCount.get() + 1);
}

使用并发集合

java.util.concurrent包提供线程安全的集合类,如ConcurrentHashMapCopyOnWriteArrayList等。

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);

使用CompletableFuture

CompletableFuture支持异步编程和任务组合,简化多线程协作。

java并发如何控制

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(s -> s + " World")
    .thenAccept(System.out::println);

选择合适的方法

  • 简单同步:synchronizedvolatile
  • 复杂锁控制:ReentrantLock
  • 无锁编程:原子类。
  • 线程协作:CountDownLatchCyclicBarrierSemaphore
  • 线程隔离:ThreadLocal
  • 高性能集合:并发集合类。
  • 异步任务:CompletableFuture

标签: java
分享给朋友:

相关文章

java如何创建线程

java如何创建线程

创建线程的方法 在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。以下是具体实现方法: 继承Thread类 通过继承Thread类并重写run()方法可以创建线程。…

如何用java

如何用java

用Java实现基础功能 Java是一种广泛使用的编程语言,适用于开发各种应用程序。以下是几个常见功能的实现方法。 打印"Hello, World!" public class HelloWorl…

java如何自学

java如何自学

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

如何学好java

如何学好java

理解基础概念 掌握Java的核心概念是学习的基础。包括数据类型、变量、运算符、控制流(如循环和条件语句)、数组等。理解面向对象编程(OOP)的四大特性:封装、继承、多态和抽象。 实践编程练习 通过实…

java如何打印数组

java如何打印数组

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

如何阅读java源码

如何阅读java源码

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