如何防止方法由同一类实例中的不同线程并发执行

时间:2018-12-03 10:33:35

标签: java multithreading concurrency

说我有两个线程,都是从给定的类实例A开始的。线程必须从同一实例执行一个方法,但一次只能执行一个。我尝试使该方法同步,但显然在有不同的实例尝试调用该方法时适用(据我了解;如果我错了,请原谅我)。

那么,我该如何以标准或推荐的方式来实现这一目标呢?

编辑:这是相关代码:

public class A {
.
.
.
  public void method1(){

    ExecutorService threadObject = Executors.newSingleThreadExecutor();
            threadObject.execute(new Runnable(){
                @Override
                public void run() {
                    try {
                        while (someCondition) {
                          //Here's one invocation
                          someObject = readObject();
                        }
                    }
                    catch (IOException | ClassNotFoundException ex) {}
                }
            });

    //Here's the other invocation
    while(someCondition){
      someObject = readObject();
    }
  }

  //Here's the synchronized method
  private synchronized SomeClass readObject() throws IOException, ClassNotFoundException{
          return (SomeClass) incomingResponses.readObject();
  }

  //Main method to instantiate the class
  public static void main(String ... args) {
    A = new A();
    A.method1();
  }
}

我仍然不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

synchronized方法是一种快捷方式。 IMO,在开始使用快捷方式之前,您应该学得很长:

如果您有这个:

class A {
    synchronized SomeType myMethod(...) {
        doSomeStuff(...);
        ...
        return someThing;
    }
}

这是使用顶级synchronized statement编写方法声明的快捷方式:

class A {
    SomeType myMethod(...) {
        synchronized (this) {
            doSomeStuff(...);
            ...
            return someThing;
        }
    }
}

IMO,您应该先学习如何使用同步语句,然后在对同步语句的工作方式有了更好的了解之后,才使用同步方法。

答案 1 :(得分:0)

您的陈述是错误的。引用documentation的相关示例:

  
      
  • 首先,不可能对同一对象的两次同步方法调用进行交织。当一个线程正在执行时   对象的同步方法,所有其他调用的线程   同一对象块的同步方法(挂起执行)   直到对象完成第一个线程为止。
  •   
  • 第二,当同步方法退出时,它会自动与任何后续方法建立事前发生的关系   为同一对象调用同步方法。这个   保证对象状态的更改对所有人可见   线程。
  •   

因此,在方法上应用的synchrinzed关键字将不允许在特定对象实例上并发调用该方法。