当前位置:首页 > Java

如何同步 java

2026-03-20 08:42:02Java

同步 Java 的方法

使用 synchronized 关键字

synchronized 可以修饰方法或代码块,确保同一时间只有一个线程访问共享资源。修饰方法时,锁对象是当前实例(非静态方法)或类对象(静态方法)。

public synchronized void synchronizedMethod() {
    // 同步方法
}

修饰代码块时,需明确指定锁对象。

public void method() {
    synchronized (this) {
        // 同步代码块
    }
}

使用 ReentrantLock

ReentrantLock 是显式锁,提供比 synchronized 更灵活的锁定机制,支持公平锁、可中断锁等特性。

private final ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 同步代码
    } finally {
        lock.unlock();
    }
}

使用 volatile 关键字

volatile 确保变量的可见性,但不保证原子性。适用于单个变量的简单同步场景。

如何同步 java

private volatile int counter;

使用原子类(AtomicInteger 等)

java.util.concurrent.atomic 包提供原子类(如 AtomicInteger),通过 CAS 操作保证原子性,适合计数器等场景。

private AtomicInteger counter = new AtomicInteger(0);

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

使用 CountDownLatchCyclicBarrier

CountDownLatchCyclicBarrier 用于协调多个线程的执行顺序。CountDownLatch 是一次性的,CyclicBarrier 可重复使用。

如何同步 java

CountDownLatch latch = new CountDownLatch(3);

// 线程中调用
latch.countDown();
latch.await(); // 等待其他线程完成

使用 Semaphore

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

Semaphore semaphore = new Semaphore(3);

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

使用线程安全的集合类

ConcurrentHashMapCopyOnWriteArrayList 等线程安全集合类,适用于高并发场景。

Map<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");

使用 ThreadLocal

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

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

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

选择同步方法的依据

  • 简单同步:优先使用 synchronizedvolatile
  • 复杂锁需求:使用 ReentrantLockSemaphore
  • 高性能场景:选择原子类或线程安全集合。
  • 线程协作:使用 CountDownLatchCyclicBarrier
  • 线程隔离:使用 ThreadLocal

标签: java
分享给朋友:

相关文章

如何使用java

如何使用java

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

如何运行java

如何运行java

运行Java程序的方法 安装Java开发工具包(JDK) 确保系统已安装JDK。可通过命令行输入 java -version 检查是否安装。若未安装,需从Oracle官网或OpenJDK下载并配置环境…

java如何输入

java如何输入

使用Scanner类进行输入 Scanner类是Java中最常用的输入工具,适用于从控制台或文件读取数据。需要导入java.util.Scanner包。 基本语法: Scanner sca…

如何安装java运行环境

如何安装java运行环境

下载Java开发工具包(JDK) 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本进行下载。Windows用户通常选择.exe安装包,macOS用户选择.dmg,Linu…

如何成为java架构师

如何成为java架构师

掌握扎实的Java基础 深入理解Java核心知识,包括多线程、集合框架、JVM原理、设计模式等。熟悉Java生态中的常用框架如Spring、MyBatis、Hibernate等,并能分析其源码实现。…

java如何实现多继承

java如何实现多继承

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