说我有两个线程,都是从给定的类实例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();
}
}
我仍然不确定我做错了什么。
答案 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
关键字将不允许在特定对象实例上并发调用该方法。