【问题标题】:synchronized with local object与本地对象同步
【发布时间】:2016-06-01 08:07:57
【问题描述】:

我刚刚阅读了一些代码,并注意到有一些代码与本地对象同步。有人能告诉我这样做意味着什么,因为我们只是创建了一个新的本地对象,为什么要锁定它?

list queue;
...

public send()
{
    entry = waitEntry();
    //add this object into the list
    queue.add(entry);
    ...
    synchronized( entry )
    {
        //do some sth
        entry.wait();
    }
}

然后,当我们收到响应时,解锁这个对象

public receive()
{
    entry = list.get() <-- get the object we have sent before
    synchronized( entry )
    {
        entry.notify()
    }
}

如你所见,我之前已经锁定了“入口”,如何在receive()方法中再次锁定它?

谢谢大家。

【问题讨论】:

  • 这些方法有 2 个线程。 1从java发送到c,另一个从c通知到java。
  • 这看起来更像是从 Java 到 Java。并且wait() 会暂时解锁,因为等待线程进入睡眠状态。唤醒后会再次锁定。
  • 那不是本地对象。
  • 这和C++有什么关系吗?
  • @Galik : 我只写场景,不写 c++ 代码

标签: java c++ object local synchronized


【解决方案1】:

如果您有多个正在运行的线程将访问同一资源,您可能会遇到一些并发问题,在您的示例中,第一个线程会将条目添加到队列中,然后该线程必须等待其他代码影响他的操作在这个资源上。由于两个线程同时执行,receive 方法可能会读取处于错误状态的入口资源(在 send 方法对资源执行之前)。

这就是我的理解,我可能错了。 如果您想了解有关此类问题的更多信息,您应该阅读有关 concurrency 的文章

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多