我应该在私人函数上使用'synchrnonized'关键字吗?

时间:2016-05-31 15:40:35

标签: java multithreading concurrency

我有一个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()函数上同步关键字是否值得?

3 个答案:

答案 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上添加同步