java - 同步 不同步

标签 java android multithreading synchronized

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

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

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");
    }
}

查看日志打印输出,我看到它们以意外的顺序打印。根据我对同步的理解,粗体语句应该是非粗体打印输出无法解释的,但事实并非如此,我试图避免的事情正在发生:我错过了下一步,因为我设置了它当它仍然为真并立即将其变为假时为真。

 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!

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**  

最佳答案

正如问题评论中提到的,一个线程能够重新进入它自己的同步锁。 “makeMove()”函数调用实际上是调用“move()”的始作俑者,这意味着它在同一个线程下执行,因此不会被锁定。简而言之,下面的代码不会导致死锁;它会毫无问题地执行,这就是我遇到的情况。

synchronized(movementMutex_)
{
    synchronized(movementMutex_)
    {
        doSomething();
    }
}

关于java - 同步 不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923296/

相关文章:

java - 尝试运行测试用例时显示 APK META-INF/LICENSE 错误中复制的重复文件

java - 在 Java 中连接两个整数以获得 float

java - 是否可以在 Java 中创建程序来创建要在 Chrome 中链接的文本?

java - 无法应用自定义编辑文本的样式

android - 在 ListView 中显示文件列表

java - 如何通过角色声明来验证用户身份?

java - 从 POJO 生成 Map<String,String>

multithreading - LOCK 前缀与 MESI 协议(protocol)?

asp.net - 在高流量场景中使用 ASP.NET 中的 ThreadPool.QueueUserWorkItem

java - 主线程退出的多线程,其他线程是否有可能无限运行