synchronized()/wait()/notifyAll() 在 Java 中做什么?

可能的重复:
Java 同步

我正在读《开始Android Games》这本书。

它使用了很多,但我真的不明白它做了什么。我已经很久没有使用Java了,我不确定我是否曾经使用过多线程。synchronized()

在 Canvas 示例中,它使用 .但是,在 OpenGL ES 示例中,它创建了一个名为 的对象,然后使用 。当游戏状态更改时,它会调用,然后synchronized(this)stateChangedsynchronized(stateChanged)stateChanged.wait()stateChanged.notifyAll();

一些代码:

    Object stateChanged = new Object();

    //The onPause() looks like this:
    public void onPause()
        {
            synchronized(stateChanged)
            {
                if(isFinishing())
                    state = GLGameState.Finished;
                else
                    state = GLGameState.Paused;

                while(true)
                {
                    try
                    {
                        stateChanged.wait();
                        break;
                    } catch(InterruptedException e)
                    {
                    }
                }
            }
        }
//The onDrawSurface looks like this:
public void onDrawFrame(GL10 gl)
    {
        GLGameState state = null;
        synchronized(stateChanged)
        {
            state = this.state;
        }

        if(state == GLGameState.Running)
        {

        }

        if(state == GLGameState.Paused)
        {
            synchronized(stateChanged)
            {
                this.state = GLGameState.Idle;
                stateChanged.notifyAll();
            }
        }

        if(state == GLGameState.Finished)
        {
            synchronized(stateChanged)
            {
                this.state = GLGameState.Idle;
                stateChanged.notifyAll();
            }
        }
    }

//the onResume() looks like this:
synchronized(stateChanged)
        {
            state = GLGameState.Running;
            startTime = System.nanoTime();
        }

答案 1

关键字用于保持变量或方法的线程安全。如果将变量包装在同步块中,如下所示:synchronized

synchronized(myVar) {
    // Logic involing myVar
}

然后,当同步块内的逻辑正在运行时,任何从另一个线程修改 myVar 值的尝试都将等到块完成执行。它确保进入块的值在该块的生命周期中是相同的。


答案 2

本 Java 教程可能可以帮助您了解在对象上使用同步的功能。

当调用 时,它将释放该对象上持有的锁(当您说时会发生这种情况),并冻结线程。然后,该线程将等待,直到或由单独的线程调用。一旦发生这些调用之一,它将允许由于继续而停止的任何线程。这并不意味着调用或将冻结并将控制权传递给等待线程的线程,它只是意味着这些等待线程现在能够继续,而以前它们不能。object.wait()synchronized(object)object.notify()object.notifyAll()object.wait()object.notify()object.notifyAll()


推荐