【问题标题】:java synchronized (this) scope [duplicate]java同步(this)范围[重复]
【发布时间】:2014-02-07 09:19:02
【问题描述】:

如果我在同一个java类的两个函数中写synchronized(this),但是这两个函数可能被两个线程调用,这段代码还能用吗?

一些假代码可能看起来像:

class A {
        public funA()
            synchronized (this) {
                // do some things here;
            }
        }

        public funB() {
            synchronized (this) {
                // do other things here;
            }
        }
}

或者我需要添加一个变量来做到这一点?

【问题讨论】:

  • 我不认为它是重复的,但它可能被认为是“仅供参考:另见……”
  • @JVMATL 考虑到 OP 似乎不理解代码的作用,我觉得它回答了这个问题。

标签: java


【解决方案1】:

这意味着多个线程不能'同时'进入这两个同步块(或其中之一)。它是否有效取决于您想要实现的目标。

当前处于这种同步块中的线程在那个时刻被称为拥有对象的监视器(在这种情况下,对象的监视器指向this)。

【讨论】:

  • 其实不是这个意思。其他一些线程可以在外部同步实例并阻止任何线程进入这些块。
  • @BrianRoach 实际上就是这个意思。在这种情况下,该线程拥有对象监视器,因此 0 个线程可以进入此处(这符合我的声明)。我在这里不评论外部或内部。每个对象只有一个监视器。
  • 我可能对你原来的措辞感到困惑;这更清楚了。
【解决方案2】:

线程在this 上同步。所以同时只有一个线程在类中(假设没有其他方法)。您没有单独同步这些方法。所以这可能工作正常。虽然很难说,因为我不知道你想在这些方法中做什么。并发总是很棘手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多