在Java中使用同步锁

Ros*_*ays 2 java multithreading synchronization synchronized thread-safety

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

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

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

可运行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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

可运行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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

Mik*_*ffe 5

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

或者你可以改变其中的一个先做好自己的工作,然后打电话notify(),然后wait().同样,你必须确保其他线程已经在等待.