如果我编写一个“扩展线程”的类,并且对于该类的每个对象实例,都有另一个类的对象变量。例如:
public class MyClass extends Thread{
private int num;
private MyClass2 obj;
public MyClass(int num, MyClass2 obj){
this.num = num;
this.obj = obj;
}
在该类中,我编写了使用 MyClass2 方法的同步方法。例如:
public synchronized int doSomething(){
obj.someMethod();
}
我的问题是:
1)当我从同步方法调用类 MyClass2 中的方法时,它仍然是同步的和原子的,或者当它转到其他非同步方法时,它会继续与其他线程一起使用?
2)如果它将停止同步...并且我希望它同步,我是否需要使“MyClass2”类中的“someMethod”也同步?
3)如果我声明了两个不同的“MyClass”类对象,但它们都有相同的“MyClass2”对象,那么如果调用 doSomething 方法,它们是否会同步?
最佳答案
您可以将同步方法视为:
public int doSomething(){
synchronized(this) //this is the protected object
{
obj.someMethod();
//Whatever other code you my have within doSomething
}
}
如果两个同步区域引用 protected 对象,则它们不能同时运行,但这并不能避免非同步代码使用该对象。
回答您的问题:
- (问题 1 和 2)当您的同步方法运行时,非同步方法或 protected 对象上没有同步区域的方法(在您的情况下为
this
)不会被阻止。 - (问题 3)不,他们不会,在这种情况下,您需要保护
obj
,因为同步方法的隐式 protected 对象是this
,即实例正在调用谁的方法。
如果在不同的 MyClass
实例中使用 obj
引用,则必须同步对该对象的任何访问:
public int doSomething() {
synchronized(obj) //Now, obj is the protected object
{
obj.someMethod();
}
}
关于java - 包含其他对象的对象的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24475618/