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

斯顿96

我有一个主线程和一个工作线程。主线程将任务添加到队列中,工作线程将其用于计算数据。在将对象放入队列之前,我在任务对象内部的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);
    }
}
Borjab

为什么不只使用一个许可就使用信号量您无需获取锁定操作,而是获得单个许可证。您应该始终使用release()释放锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章