Java在不同线程上锁定和解锁

标签 java multithreading locking reentrantlock

我有一个主线程和一个辅助线程。主线程将任务添加到队列中,工作线程将它们用于计算数据。在将对象放入队列之前,我对任务对象内的 ReentrantLock 对象(在主线程上)调用了锁定。当工作线程完成处理队列中的任务时,我调用解锁(在工作线程上)。问题是我得到一个 IllegalMonitorStateException,因为我在不同的线程上调用锁定和解锁。

我正在寻找可以在不同线程上执行此操作的替代锁定系统。

例子:

public class Worker extends Thread {
    public static Queue<Task> tasks = new ConcurrentLinkedQueue<Task>();

    @Override
    public void run() {
        while (true) {
            Task task = tasks.poll();

            if (task != null) {
                task.work();
                task.lock.unlock(); // Here is the unlock, Task#i should not change up to now
            }
        }
    }
}


public class Task {
    private int i = 0;
    public Lock lock;

    public void setI(int i) {
        lock.lock();
        this.i = i;
        lock.unlock();
    }

    public void work() {
        System.out.println(i);
    }
}


public class Test {
    Task task = new Task();

    public void addTask() {
        task.lock.lock(); // Here is the lock, Task#i should not change
        Worker.tasks.add(task);
    }
}

最佳答案

为什么不使用 Semaphore只有一张许可证?您获得的不是锁定操作,而是单一许可。您应该始终使用 release() 释放锁。

关于Java在不同线程上锁定和解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652352/

相关文章:

java - java中安全的多线程文件创建

synchronization - MIPS 与锁同步

c - 服务器架构之谜,C编程

java - Spring Boot - 休息模板和休息模板构建器

java - 究竟什么时候需要类型转换?

java.net.Socket > InputStream > BufferedReader.read(char[]) 阻塞线程

java - 快速音频文件输出

c++ - std::condition_variable::wait_until 的实现

java - 在链表中指定元素之前插入一个元素

java - 我如何更改代码,以便垃圾收集器将由于程序而删除此实例?