首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类中具有同步方法组合的线程的行为

类中具有同步方法组合的线程的行为
EN

Stack Overflow用户
提问于 2010-12-20 14:23:59
回答 2查看 1.3K关注 0票数 4

案例1

我有两个同步方法,如下所示:

代码语言:javascript
运行
复制
class A {
    public void synchronized methodA() {}
    public void synchronized methodB() {}
}

A:,我有线程T1和T2。线程能够同时执行属于A类的同一个实例的methodAmethodB吗?

  • 我的分析:答案是no,因为只有一个方法将由线程T1执行,而线程T2将被阻塞,直到T1完成执行。

B:,我有线程T1和T2。线程能否同时执行属于A类不同实例的methodAmethodB

  • ,我的分析:答案是,是,,因为T1和T2可以执行属于A类不同实例的methodAmethodB,它们不会被阻塞。

根据我对案例1的分析,我的理解正确吗?

更新:案例2

我有两个同步方法,一个是非静态的,另一个是静态的。

代码语言:javascript
运行
复制
class A {        
    public void synchronized methodA() {}    
    public void static synchronized methodB() {}    
}       

A:,我有线程T1和T2。线程能够同时执行属于A类的同一个实例的methodAmethodB吗?

  • 我的分析:答案是no,因为只有一个方法将由T1执行,而T2将被阻塞,直到T1完成执行。

B:,我有线程T1和T2。线程能否同时执行属于A类不同实例的methodAmethodB

  • 我的分析:答案是,因为T1和T2可以执行属于不同实例的methodAmethodB,它们不会被阻止。

根据我对案例2的分析,我的理解正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-20 14:26:56

案件A:否

案件B:是

你的分析是正确的。实例方法上的同步关键字在功能上等价于以下内容:

代码语言:javascript
运行
复制
public void someMethod() {
   synchronized(this) {
      //code
   }
}

因为this在这两种环境中是不同的,所以它们并不是相互排斥的。请注意,对于两个不同的实例,甚至可以同时调用相同的方法。

编辑

对于第二种情况,你在2A上是不正确的,它甚至没有意义。静态同步方法不“属于”类的实例;如果“属于”,则不会是静态的!它不会对类的任何实例进行同步(它没有对要同步的实例的引用!)因此,它将同步在A的类对象上。类A中的静态同步方法等效于以下内容:

代码语言:javascript
运行
复制
public static void methodB() {
   synchronized (A.class) {
      //code
   }
}

如我前面所示,您的实例方法将在实例上同步,因此这两个线程可以并行运行。

在B种情况下,很明显,它们也可以并行运行,但您仍然缺少静态方法与任何实例无关的基本概念。

票数 4
EN

Stack Overflow用户

发布于 2010-12-20 14:31:03

案例1:您是正确的。

每个Java对象都有一个相关的互斥锁(互斥锁(互斥锁))。当synchronized应用于非静态方法时,被锁定的是实例的互斥对象.因此,synchronized方法在每个对象的基础上工作。

静态synchronized方法使用类对象的锁,因此在每个类的基础上操作(模块化ClassLoader),独立于非静态方法。您还可以在方法主体中使用synchronized()来使用任意对象的锁。

Case 2:是不正确的,因为methodA()和methodB()使用不同的互斥,如上所述。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4490498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档