java - 包含其他对象的对象的同步方法

标签 java multithreading synchronized

如果我编写一个“扩展线程”的类,并且对于该类的每个对象实例,都有另一个类的对象变量。例如:

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/

相关文章:

java - Spring 启动: Inject beans from tests into web environment

java - 如何在不重新加载页面的情况下从 Javafx 编辑 HTML 页面(在 webview 中)?

java - 得到相同的随机数

java - Java中线程或进程的内存使用

java - 使用 volatile 标志替代锁定的技术

java - 如何使用 CyclingBarrier 同步线程并保留其执行顺序?

java - 如果我有两个方法不能在不同线程的一个类中同时发生,如何锁定它?

一旦导出值,Java方法递归就会出现问题

java - 线程 volatile

java - Java 8接口(interface)方法中不允许 “synchronized”是什么原因?