案例1
我有两个同步方法,如下所示:
class A {
public void synchronized methodA() {}
public void synchronized methodB() {}
}
A:,我有线程T1和T2。线程能够同时执行属于A类的同一个实例的methodA
和methodB
吗?
B:,我有线程T1和T2。线程能否同时执行属于A类不同实例的methodA
和methodB
?
,
methodA
和methodB
,它们不会被阻塞。根据我对案例1的分析,我的理解正确吗?
更新:案例2
我有两个同步方法,一个是非静态的,另一个是静态的。
class A {
public void synchronized methodA() {}
public void static synchronized methodB() {}
}
A:,我有线程T1和T2。线程能够同时执行属于A类的同一个实例的methodA
和methodB
吗?
B:,我有线程T1和T2。线程能否同时执行属于A类不同实例的methodA
和methodB
?
methodA
和methodB
,它们不会被阻止。根据我对案例2的分析,我的理解正确吗?
发布于 2010-12-20 14:26:56
案件A:否
案件B:是
你的分析是正确的。实例方法上的同步关键字在功能上等价于以下内容:
public void someMethod() {
synchronized(this) {
//code
}
}
因为this
在这两种环境中是不同的,所以它们并不是相互排斥的。请注意,对于两个不同的实例,甚至可以同时调用相同的方法。
编辑
对于第二种情况,你在2A上是不正确的,它甚至没有意义。静态同步方法不“属于”类的实例;如果“属于”,则不会是静态的!它不会对类的任何实例进行同步(它没有对要同步的实例的引用!)因此,它将同步在A
的类对象上。类A
中的静态同步方法等效于以下内容:
public static void methodB() {
synchronized (A.class) {
//code
}
}
如我前面所示,您的实例方法将在实例上同步,因此这两个线程可以并行运行。
在B种情况下,很明显,它们也可以并行运行,但您仍然缺少静态方法与任何实例无关的基本概念。
发布于 2010-12-20 14:31:03
案例1:您是正确的。
每个Java对象都有一个相关的互斥锁(互斥锁(互斥锁))。当synchronized
应用于非静态方法时,被锁定的是实例的互斥对象.因此,synchronized
方法在每个对象的基础上工作。
静态synchronized
方法使用类对象的锁,因此在每个类的基础上操作(模块化ClassLoader),独立于非静态方法。您还可以在方法主体中使用synchronized()
来使用任意对象的锁。
Case 2:是不正确的,因为methodA()和methodB()使用不同的互斥,如上所述。
https://stackoverflow.com/questions/4490498
复制相似问题