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

Tia*_*sta 31 java multithreading android thread-safety

可能重复:
Java同步

我正在读" 初学Android游戏 "一书.

它使用synchronized()了很多,但我真的不明白它的作用.我很久没有使用Java了,我不确定我是否使用过多线程.

在它使用的Canvas示例中synchronized(this).但是在OpenGL ES示例中,它创建了一个被调用的Object stateChanged然后使用synchronized(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();
        }
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 50

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

synchronized(myVar) {
    // Logic involing myVar
}
Run Code Online (Sandbox Code Playgroud)

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


tda*_*roy 31

这个Java教程可能可以帮助您理解在对象上使用synchronized的功能.

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


Tan*_*ien 10

当像这样使用时:

private synchronized void someMehtod()
Run Code Online (Sandbox Code Playgroud)

你得到这些效果:

1.首先,对同一对象的两个同步方法的调用不可能进行交错.当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法(暂停执行)直到第一个线程完成对象.

2.其次,当同步方法退出时,它会自动与同一对象的同步方法的任何后续调用建立先发生关系.这可以保证对所有线程都可以看到对象状态的更改.

(摘自这里)

使用同步代码块时,您会得到类似的效果:

private void someMethod() {
  // some actions...

  synchronized(this) {
    // code here has synchronized access
  }

  // more actions...
}
Run Code Online (Sandbox Code Playgroud)

正如解释这里