首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >synchronized 和 wait/notify

synchronized 和 wait/notify

原创
作者头像
兰亭集
发布2026-04-26 10:24:18
发布2026-04-26 10:24:18
170
举报
文章被收录于专栏:软件工程软件工程

synchronized 关键字

使用方法:

代码语言:java
复制
public synchronized void accessMutex() {  // 锁当前对象
    // access
}

public void accessMutex2() {
    synchronized (this) {  // 锁当前对象
        // access
    }
}

public static synchronized void accessMutex3() {  // 锁类对象-Class
    // access
}

wait/notify 方法

调用一个对象的wait/notify方法的前提是当前线程持有该对象的锁,

  • wait方法:业务条件不满足,释放对象锁,线程进入等待状态
  • notify方法:业务条件满足,唤醒等待状态下的线程,唤醒后的线程会先再获取对象锁,获取锁后继续原逻辑的执行

加锁原理

Java的每一个object都关联了一个隐藏的monitor对象,任一时刻只会有一个线程持有monitor锁,monitor对象有几个主要属性:

  • owner:持有当前monitor对象锁的线程
  • recursions:线程加锁的重入次数
  • entry_list:等待获取锁的线程队列
  • wait_set:调用Object.wait()方法的线程会加入到此队列中,调用Object.notify()方法会将线程从wait_set移到entry_list中

示例:多线程生产和消费场景下线程安全的消费队列

代码语言:java
复制
public class MyBlockingQueue<T> {

    private Object[] data;
    private int getIndex;
    private int putIndex;
    private int cnt;

    public MyBlockingQueue(int size) {
        this.data = new Object[size];
    }

    public synchronized void put(T item) throws InterruptedException {
        while (cnt == data.length) {  // 队列满,等待消费。线程唤醒后需重新检查条件是否满足
            this.wait();
        }
        data[putIndex] = item;
        putIndex = nextIndex(putIndex);
        cnt++;
        this.notifyAll();  // 多线程场景下需唤醒所有等待线程
    }

    public synchronized T get() throws InterruptedException {
        while (cnt == 0) {  // 队列空,等待生产。线程唤醒后需重新检查条件是否满足
            this.wait();
        }
        Object item = data[getIndex];
        getIndex = nextIndex(getIndex);
        cnt--;
        this.notifyAll();  // 多线程场景下需唤醒所有等待线程
        return (T) item;
    }

    private int nextIndex(int curIndex) {
        return (curIndex + 1) % data.length;
    }

}

这里需注意,多线程场景下

  1. 线程唤醒后需重新检查条件是否满足,使用while循环检查,条件不满足则继续等待
  2. 需使用notifyAll()唤醒所有等待线程,因为notify()方法仅随机唤醒一个线程,可能会出现所有线程都因条件不满足而陷入等待状态

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized 关键字
  • wait/notify 方法
  • 加锁原理
  • 示例:多线程生产和消费场景下线程安全的消费队列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档