监视器中的并发,同时有两个函数调用来自同一个其他对象

Concurrency in monitor while having two function calls coming from the same, other object

我在 Java 中有一个监视器对象,它基本上是这样构建的,同时跳过不相关的代码:

public class TasksQueue {
    private final Lock tasksLock = new ReentrantLock();
    private final Condition newTask = tasksLock.newCondition();
    private final List<Task> taskList = new LinkedList<>();

    public Task getNextTask(BufferState buffer){
        tasksLock.lock();
        //if conditions not met await    
        (!placeholder_check()){
            try {
                newTask.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
        }
        newTask = taskList.remove(0);
        return newTask;
    }  

    public void addNextTask(Task task){
        tasksLock.lock();
        taskList.add(task);
        newAnyTask.signal();
        tasksLock.unlock();
    }
}

目前另外两个 classes 可以访问这个对象,其中一个只从队列中取出项目,另一个只向它添加项目并向进程中的第一个发出信号,如代码所示.

我的问题是 - 我可以将两个入队结束出队操作移至一个 class 处理(第二个对象通过第一个入队),它会导致死锁吗?在 await 上“挂起”并停止让其他人排队将完全停止队列的项目,或者这两个方法调用将被视为“单独的”对象在监视器中等待 Java?

这里省略了检查添加任务的类型并做出相应反应的代码,因为它不是问题的核心。

首先是您混淆了与多线程编程相关的核心概念。

不是对象在监视器上被阻塞,而是被阻塞的线程。

您可以将使用此队列的整个代码放入单个 class 中并创建单个对象。这不会造成任何问题。

但是,要执行此代码,您需要使用多个线程。执行尝试从队列中读取的代码的线程将被阻塞(如果队列为空),但是它不会阻止另一个线程执行将元素添加到队列和信号的代码,以恢复阻塞的操作线程。

我强烈推荐一本书 Java 并发实践。