首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已同步未同步

已同步未同步
EN

Stack Overflow用户
提问于 2012-08-12 23:17:56
回答 1查看 544关注 0票数 2

synchronized似乎没有像我预期的那样工作。它不应该使括号内的代码相对于由同一对象进行synchronized的单独代码块是原子的吗?

我发现它在我的代码中根本不同步。

代码语言:javascript
复制
private Object movementMutex_ = new Object();    

// Thread
public void run()
{
    while (run_)
    {
        synchronized(movementMutex_)
        {
            if (timeToMove_)
            {
                Log.v("meh", "timeToMove_ was true, moving");
                makeMove();
                Log.v("meh", "Move Complete. Setting timeToMove_ to false");
                timeToMove_ = false;
                Log.v("meh", "timeToMove_ is now false");
            }
        }
    }
}


// Called by a different thread so that this thread knows when to make a move
public void move()
{
    Log.v("meh", "awaiting movementMutex in move()");
    // Synchronizing so that timeToMove_ doesn't get set true while in the middle of moving and thus setting it back false prematurely
    synchronized(movementMutex_)
    {
        Log.v("meh", "move called, setting timeToMove_");
        timeToMove_ = true;
        Log.v("meh", "timeToMove_ is now true");
    }
}

查看Log打印输出,我发现它们的打印顺序出乎意料。根据我对synchronized的理解,粗体的语句应该无法被非粗体的打印输出解释,但事实并非如此,我试图避免的事情正在发生:我错过了下一步,因为我在它仍然为真的时候将其设置为真,并立即将其转换为假。

代码语言:javascript
复制
 08-12 10:47:19.860: V/meh(27639): awaiting movementMutex in move()  
 08-12 10:47:19.985: V/meh(27639): move called, setting timeToMove_  
 08-12 10:47:19.985: V/meh(27639): timeToMove_ is now true  
 08-12 10:47:19.985: V/meh(27639): **timeToMove_ was true, moving**  
 08-12 10:47:20.352: V/meh(27639): awaiting movementMutex in move()  

下一行应该是不可能的。它不是在等待movementMutex!

代码语言:javascript
复制
08-12 10:47:20.352: V/meh(27639): move called, setting timeToMove_  
08-12 10:47:20.360: V/meh(27639): timeToMove_ is now true  
08-12 10:47:20.360: V/meh(27639): **Move Complete. Setting timeToMove_ to false**  
08-12 10:47:20.360: V/meh(27639): **timeToMove_ is now false**  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-15 00:35:25

正如对该问题的注释中所提到的,线程能够重新进入它自己的同步锁。"makeMove()“函数调用实际上是调用"move()”的发起者,这意味着它在同一线程下执行,因此不会被锁定。简而言之,下面的代码不会导致死锁;它会毫无问题地执行,这就是我所经历的。

代码语言:javascript
复制
synchronized(movementMutex_)
{
    synchronized(movementMutex_)
    {
        doSomething();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11923296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档