我的@synchronized块出了什么问题?

Mor*_*ess 2 iphone multithreading cocoa-touch objective-c nsthread

我的应用程序中有2个线程,一个游戏更新线程和渲染/ IO /主线程.我的更新线程更新游戏状态,渲染线程根据游戏状态模型的更新值和存储在对象(gameEngine)中的一些其他变量来渲染场景.

渲染线程在游戏线程仍在更新时执行,这是一个问题,因此在我看来,解决方案是使用@synchronized,如下所示:

        @synchronized(gameEngine)
        {
            [gameEngine update];

            nextUpdate = now + GAME_UPDATE_INTERVAL;

            gameEngine.lastGameUpdateInterval = now - lastUpdate;
            gameEngine.lastGameUpdateTime = now;
            lastUpdate = now;
        }
Run Code Online (Sandbox Code Playgroud)

但渲染线程仍然访问块之间-update的最后3行之间的gameEngine对象.为什么是这样?

ken*_*ytm 10

@synchronized不会阻止其他线程访问gameEngine.它只是@synchronized用同一个对象阻止其他对象.这意味着

// thread A:
@synchronized(a) {
   do_A(a);
}
...
// thread B:
do_B(a);
Run Code Online (Sandbox Code Playgroud)

do_A并且do_B可以一起发生,但是在

// thread A:
@synchronized(a) {
   do_A(a);
}
...
// thread B:
@syncrhonized(a) {
   do_B(a);
}
Run Code Online (Sandbox Code Playgroud)

do_Ado_B将总是被顺序执行.