并发编程--线程间如何通信?

线程间的通信

在多线程的世界里,沟通可是件大事。想象一下,如果办公室里的同事们不互相交流,那会是怎样的混乱场景?嗯,线程间的通信就像同事们之间的交流,非常重要。今天,我们就来聊聊线程间的通信,特别是两个重要的修饰词:volatile 和 synchronized,以及等待通知机制。

两个重要的修饰词

volatile

volatile修饰符用于修饰字段或变量,主要有以下两个作用:

  1. 刷新共享内存:当一个线程对volatile变量进行修改时,该修改会立即被刷新到主内存中。
  2. 保证可见性:所有线程读取volatile变量时,都能看到最新的值。也就是说,当一个线程修改了volatile变量的值,其他线程可以立即感知到这个变化。

使用volatile可以有效避免某些情况下的线程不安全问题,但它并不能保证复合操作的原子性。例如,volatile不能保证自增操作(如i++)的线程安全。

synchronized

synchronized关键字可以用于修饰方法或者同步块,具有以下作用:

  1. 排他性:保证在同一时刻,只有一个线程能够执行被synchronized修饰的方法或代码块。
  2. 可见性:线程进入同步块之前,必须重新读取主内存中的最新变量值;在退出同步块时,必须将变量的修改刷新到主内存中。

synchronized通过监视器机制实现,本质上是一个锁。线程在进入同步方法或同步块之前,必须先获得监视器(锁),在退出时则释放监视器。

等待通知机制

等待通知机制是指一个线程通过调用对象的wait()方法进入等待状态,另一个线程通过调用对象的notify()notifyAll()方法唤醒等待中的线程。

工作原理

  1. 等待方:线程A调用对象O的wait()方法后,会进入等待状态,直到收到通知或被中断。
  2. 通知方:线程B调用对象O的notify()notifyAll()方法,通知等待在对象O上的一个或多个线程。

示例

class WaitNotifyExample {
    private final Object lock = new Object();
    private boolean condition = false;

    public void waitMethod() {
        synchronized (lock) {
            while (!condition) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            // 执行后续操作
        }
    }

    public void notifyMethod() {
        synchronized (lock) {
            condition = true;
            lock.notify();
        }
    }
}

在这个示例中,waitMethod方法中的线程会等待condition变为true,而notifyMethod方法中的线程将condition设置为true并通知等待的线程。

总结

碎碎念

        首先,让我们来认识一下 volatile。这位修饰词先生,是个很注重信息共享的家伙。它修饰的字段或变量,就像是办公室里的公告板,任何人对它的修改,都会立刻被所有人看到。这就是 volatile 的魅力——保证了线程间变量的可见性。不管哪个线程去读取这个变量,都能得到最新的值。

        接下来是 synchronized,这位修饰词小姐,则是个讲究排他性的角色。她修饰的方法或代码块,就像是一个会议室,一次只能有一个线程进去“开会”。这就保证了在同一时刻,只有一个线程能访问这个方法或代码块,从而保证了线程的安全性和一致性。

        我们来看看等待通知机制。这就像是一个线程(比如叫小明)在等待一个信号,才能继续工作。小明调用对象(比如一个任务列表)的 wait() 方法,就像是他在会议室外的沙发上打盹,等待有人叫醒他。另一个线程(比如叫小红)完成了某个任务,调用同一个对象的 notify() 或 notifyAll() 方法,就像是她在会议室里喊:“大家注意了,有新任务了!”这时,小明听到通知,就会从 wait() 方法返回,继续他的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值