在Java中使用同步锁

时间:2011-03-07 00:08:12

标签: java multithreading synchronization thread-safety synchronized

我一直在乱用Java中的同步,它还没有为我工作。

我有两个用于创建单独线程的Runnable对象,每个对象都有一个共享ArrayList句柄和一个共享Object(用于synchronized)。第一个Runnable总是为数组列表中的所有对象读取tsome实例变量,第二个Runnable不断更新数组列表中所有对象的实例变量。

我现在设置它的方式,两个Runnable对象都包含一个指向我打算用作锁的Object的指针。

Runnable 1:

public void run() {
    if (syncLock == null)
        return;
    synchronized (syncLock) {
        try {
            syncLock.wait();
        } catch (InterruptedException e) {
        }

        for (int i = 0; i < list.size(); i++) {
            drawItem(list.get(i));
        }
        syncLock.notify();
    }
}    

Runnable 2:

public void run() {
    if (syncLock == null)
        return;
    synchronized (syncLock) {
        try {
            syncLock.wait();
        } catch (InterruptedException e) {
        }

        for (int i = 0; i < list.size(); i++) {
            updateItem(list.get(i));
        }
        syncLock.notify();
    }
}    

所以从技术上讲,第一个Runnable总是在屏幕上绘制对象,第二个是根据时间的变化计算项目的新位置。

我缺少什么?

1 个答案:

答案 0 :(得分:5)

看起来你的线程都要开始并卡在wait()中,除非你有一些其他对象你没有在notify()其中一个显示(只是为了启动它们) 。)你必须确保两个线程都在等待。

或者,您可以先更改其中一个,然后再调用notify(),然后wait()。同样,你必须确保其他线程已经在等待。

相关问题