我有一个MyService
类,它只有一个public
方法doTask()
,我使用synchronized
关键字来保证以线程安全的方式访问它:< / p>
public class MyService {
String myTaskId;
public MyService {
myTaskId = getTaskId();
}
public synchronized void doTask() {
myTaskId = getTaskId();
...
}
private String getTaskId() {
...
}
}
有一个私有函数getTaskId()
,它在构造函数和doTask()
函数中都被调用。我想知道在getTaskId()
函数上同步关键字是否值得?
答案 0 :(得分:0)
您的示例代码不显示任何变量。人们谈论同步方法,但同步的目的与方法无关:它都是关于保护共享数据。
在我工作的地方,在sf.apply(lambda row: trans(row['user_score'], row['weight']))
方法中查看synchronized private
方法和/或synchronized
块非常常见。只要两个或多个线程可以同时输入方法/块来操作相同的数据,我们就会这样做。
知道方法是private
并没有告诉你什么线程可能会调用它。它只告诉您 immediate 调用者将在同一个类中的某个位置。
答案 1 :(得分:-1)
这个问题与关于堆栈溢出的另一个问题是一致的。 If a synchronized method calls another non-synchronized method, is there a lock on the non-synchronized method
由于getTaskId未同步,因此当synchronized方法调用它时,不会创建锁。但同样,因为它是私人锁不会产生任何影响。
要回答您的问题,只要它保持私有并且调用此方法的所有方法都是同步的,您就不必明确暗示相同。
答案 2 :(得分:-1)
当对象创建时,将首先调用构造函数方法。之后,可以调用方法doTaskk()。因此没有必要在getTaskId上添加同步