当前位置:首页 > 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如何产生随机数

使用 Math.random() 方法 Math.random() 生成一个范围在 [0.0, 1.0) 的伪随机 double 值。通过缩放和偏移可以生成指定范围的随机数。 double ra…

java如何编写接口

java如何编写接口

编写Java接口的基本语法 在Java中,接口通过interface关键字定义,可以包含抽象方法、默认方法、静态方法和常量。 public interface MyInterface {…

如何学习java语言

如何学习java语言

学习Java语言的系统方法 理解基础概念 Java是一种面向对象的编程语言,掌握基础概念如变量、数据类型、运算符、控制流语句(if-else、循环)是第一步。熟悉类和对象的概念,理解封装、继承和多态三…

如何学java基础

如何学java基础

学习Java基础的方法 理解Java的基本概念 Java是一种面向对象的编程语言,掌握基础概念如类、对象、继承、多态和封装是必要的。熟悉Java的语法结构,包括变量、数据类型、运算符和控制语句。 安…

win7如何配置java环境变量

win7如何配置java环境变量

下载并安装Java 从Oracle官网下载适合的Java Development Kit (JDK)安装包,选择与系统位数(32位或64位)匹配的版本。运行安装程序,按照提示完成安装,默认路径通常为C…

php 实现 java md5

php 实现 java md5

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