类中同步方法组合的线程行为
情况 1
我有 2 个同步方法,如下所示:
class A {
public void synchronized methodA() {}
public void synchronized methodB() {}
}
A: 我有线程 T1 和 T2。线程能否同时执行(分别)属于 A 类同一个实例的methodA
和methodB
?
- 我的分析:答案是否定的,因为线程T1只会执行一个方法,线程T2将被阻塞,直到T1执行完毕。
B:我有线程 T1 和 T2。线程能否同时执行(分别)属于 A 类不同实例的 methodA
和 methodB
?
- 我的分析:答案是是,因为T1和T2可以执行属于A类不同实例的
methodA
和methodB
并且不会被阻塞。
根据我对案例 1 的分析,我的理解是否正确?
更新:情况 2
我有 2 个同步方法,一个是非静态的,另一个是静态的。
class A {
public void synchronized methodA() {}
public void static synchronized methodB() {}
}
A:我有线程 T1 和 T2。线程能否同时执行(分别)属于类 A 的同一个实例的methodA
和methodB
?
- 我的分析:答案是否定的,因为T1只会执行一个方法,T2将被阻塞,直到T1执行完毕。
B:我有线程 T1 和 T2。线程能否同时执行(分别)属于 A 类不同实例的methodA
和methodB
?
- 我的分析:答案是是,因为T1和T2可以执行属于不同实例的
methodA
和methodB
,并且不会被阻塞。
根据我对案例2的分析,我的理解是否正确?
Case 1
I have 2 synchronized methods as shown below:
class A {
public void synchronized methodA() {}
public void synchronized methodB() {}
}
A: I have threads T1 and T2. Can the threads simultaneously executemethodA
and methodB
(respectively) belonging to the same instance of class A?
- My analysis: The answer is no because only one method will be executed by thread T1 and thread T2 will be blocked until T1 finishes execution.
B: I have threads T1 and T2. Can the threads simultaneously execute methodA
and methodB
(respectively) belonging to different instances of class A?
- My analysis: The answer is yes because T1 and T2 can execute
methodA
andmethodB
belonging to different instances of class A and they will not be blocked.
Is my understanding correct as per my analysis for case 1?
Update: Case 2
I have 2 synchronized methods, one is non static and the other is static.
class A {
public void synchronized methodA() {}
public void static synchronized methodB() {}
}
A: I have threads T1 and T2. Can the threads simultaneously execute methodA
and methodB
(respectively) belonging to the same instance of class A?
- My analysis: The answer is no because only one method will be executed by T1 and T2 will be blocked until T1 finishes execution.
B: I have threads T1 and T2. Can the threads simultaneously execute methodA
and methodB
(respectively) belonging to different instances of class A?
- My analysis: The answer is yes because T1 and T2 can execute
methodA
andmethodB
belonging to different instances and they will not be blocked.
Is my understanding correct as per my analysis for case 2?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
情况 A: 否
情况 B: 是
您的分析是正确的。实例方法上的synchronized关键字在功能上等价于this:
由于
this
在两个上下文中是不同的,所以它们并不互斥。请注意,即使是相同的方法也可以同时为两个不同的实例调用。编辑
对于情况2,你在2A上是不正确的;这甚至没有意义。静态同步方法不“属于”类的实例;如果确实如此,它就不是静态的!它不会在类的任何实例上进行同步(它没有对要同步的实例的引用!),因此它在
A
的类对象上进行同步。类A
中的静态同步方法相当于:您的实例方法将在实例上同步,如上面所示,因此两个线程可以并行运行。
在情况 B 中,显然它们也可以并行运行,但您仍然缺少静态方法不与任何实例关联的基本概念。
Case A: No
Case B: Yes
Your analysis is correct. A synchronized keyword on an instance method is functionally equivalent to this:
Since
this
is different in the two contexts, they are not mutually exclusive. Note that even the same method could be called at the same time for two different instances.Edit
For case 2, you are incorrect on 2A; it doesn't even make sense. A static synchronized method does not "belong" to an instance of the class; if it did it wouldn't be static! It doesn't synchronize on any instance of the class (it has no reference to an instance to synchronize on!) so it instead synchronizes on the class object of
A
. A static synchronized method in classA
is equivalent to this:Your instance method will synchronize on the instance as I've shown above, so the two threads can run in parallel.
In case B then, obviously they also can run in parallel but you're still missing the fundamental concept that a static method is not associated with any instance.
情况1:你是对的。
每个 Java 对象(除其他外)都有一个关联的互斥锁(互斥锁)。当
synchronized
应用于非静态方法时,锁定的是实例的互斥锁。因此,同步
方法在每个对象的基础上工作。静态同步方法使用 Class 对象的锁,因此基于每个类(模 ClassLoader)进行操作,并且独立于非静态方法。您还可以在方法体中使用
synchronized()
来使用您想要的任何对象的锁。情况 2: 你是不正确的,因为 methodA() 和 methodB() 使用不同的互斥体,如上所述。
Case 1: You are correct.
Every Java object has (among other things) an associated mutual exclusion lock (mutex). When
synchronized
is applied to a non-static method, it is the instance's mutex that is locked. Thussynchronized
methods work on a per-object basis.Static
synchronized
methods use the lock of the Class object, so operate on a per-class basis (modulo ClassLoader) and independently of non-static methods. You can also usesynchronized()
in method bodies to use the lock of any object you wish.Case 2: You are not correct, as methodA() and methodB() use different mutexes, as described above.