[java多线程]-状态依赖

本文介绍了在多线程环境下,线程如何依赖对象状态进行操作,特别是通过内置和显示条件队列在有界阻塞队列中的应用。阐述了在条件等待中加锁、wait方法和条件谓语的关系,以及为什么在某些情况下使用`await()`而非`notifyAll()`。同时讨论了何时选择使用显示条件队列,并提到了Java并发库中阻塞队列的设计。
摘要由CSDN通过智能技术生成

概述

在单线程中调用某个方法,而方法中依赖对象的状态前置条件没有满足,那么这个条件将无法满足。然而在多线程中,一个线程依赖的对象状态的前置条件没有满足,另一个线程可能修改对象状态,从而使得前置条件满足。

多线程中对于依赖状态的操作一般是前置条件不满足,阻塞线程,当前置条件满足,唤醒线程继续执行。

在生产者-消费者的设计中经常有像BlockedQueue的有界的阻塞队列。我们下面就以有界阻塞队列来讲解状态依赖。

有界阻塞队列中需要有两个接口put用于添加元素,take接口获取元素处理。而put的前置条件为队列未满,take的前置条件为队列不为空。

内置条件队列

条件队列是它使得一组线程能够通过某种方式等待特定的条件为真,条件队列中的元素是一个个正在等待前置条件的队列。

每个对象可以作为一个条件队列,而waitnotifynotifyAll接口构成了API。

那我们使用内置的条件队列来实现有界阻塞队列。

public class BoundedBlockedQueue<E> {
   
    private final Object[] items;
    private int takeIndex;
    private int putIndex;
    private int count;

    public BoundedBlockedQueue(Object[] items) {
        this.items = items;
    }

    public synchronized E take() throws InterruptedException {
        while (count == 0)
            wait();
        return doTake();
    }

    private E doTake() {
        final Object[] items = this.items;
        @SuppressWarnings("unchecked")
        E x = (E) items[takeIndex];
        items[takeIndex] = null;
        if (&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值