gpt4 book ai didi

java - 同步 不同步

转载 作者:行者123 更新时间:2023-11-30 11:42:06 27 4
gpt4 key购买 nike

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/

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