gpt4 book ai didi

java - Java 中 synchronized()/wait()/notifyAll() 有什么作用?

转载 作者:IT老高 更新时间:2023-10-28 21:04:21 25 4
gpt4 key购买 nike

Possible Duplicate:
Java Synchronization

我正在阅读这本书开始 Android 游戏

它经常使用 synchronized() 但我不太明白它的作用。很久没用Java了,不知道有没有用过多线程。

在 Canvas 示例中,它使用 synchronized(this)。但是在 OpenGL ES 示例中,它创建了一个名为 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();
}

最佳答案

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

synchronized(myVar) {
// Logic involing myVar
}

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

关于java - Java 中 synchronized()/wait()/notifyAll() 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com