java同步(this)范围[重复]

Posted

技术标签:

【中文标题】java同步(this)范围[重复]【英文标题】:java synchronized (this) scope [duplicate] 【发布时间】: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 似乎不理解代码的作用,我觉得它回答了这个问题。 【参考方案1】:

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

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

【讨论】:

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

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

【讨论】:

以上是关于java同步(this)范围[重复]的主要内容,如果未能解决你的问题,请参考以下文章

javascript,promise,如何在 then 范围内访问变量 this [重复]

ES6 箭头函数正在改变 Meteor.publish 中 this 的范围 [重复]

带有const vs var的Javascript全局范围[重复]

如何知道日期范围是不是与Java中的另一个日期范围相交 - Groovy [重复]

JAVA怎么实现从指定范围随机取不重复的6个数字

SAP 更新编码范围