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全局范围[重复]