温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java多线程怎么加锁

发布时间:2026-10-03 09:21:44 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,多线程加锁的本质是控制对共享资源的并发访问,避免数据不一致。下面按常见程度和实用场景系统介绍几种方式。


一、synchronized(最常用、最简单)

1️⃣ 修饰实例方法(锁当前对象)

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}

2️⃣ 修饰静态方法(锁类对象)

public static synchronized void method() {
    // 锁的是 Counter.class
}

3️⃣ 同步代码块(更灵活,推荐)

private final Object lock = new Object();

public void method() {
    synchronized (lock) {
        // 临界区
    }
}

✅ 优点:简单、JVM 自动加锁释放
❌ 缺点:不够灵活,不能中断、不能超时


二、ReentrantLock(更强大的显式锁)

import java.util.concurrent.locks.ReentrantLock;

ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 临界区
    } finally {
        lock.unlock();
    }
}

高级功能

lock.tryLock();          // 尝试获取锁
lock.tryLock(1, TimeUnit.SECONDS);
lock.lockInterruptibly(); // 可中断

✅ 优点:灵活、可中断、可定时
❌ 缺点:必须手动释放(忘了会死锁)


三、读写锁(ReadWriteLock)

适合读多写少

ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

rwLock.readLock().lock();   // 多个线程可同时读
rwLock.writeLock().lock();  // 写时独占

四、CAS(无锁,高性能)

使用 Atomic 类:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();

✅ 无锁、性能高
❌ 只适合简单变量


五、并发集合(避免手动加锁)

ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue

大多数业务场景优先用并发容器


六、volatile(不是锁,但很重要)

private volatile boolean flag;

✅ 保证可见性
❌ 不保证原子性(不能替代锁)


七、如何选择?

场景 推荐
简单同步 synchronized
需要超时/中断 ReentrantLock
读多写少 ReadWriteLock
计数/状态 Atomic
集合数据 并发容器

如果你有具体业务场景(比如库存、订单、缓存),我可以直接给你最优加锁方案 + 示例代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手