2014-09-29 88 views
0

我有一个实用方法作为的Util类:是我的静态util的方法线程安全

public static String formatAmount(String amount) throws Exception { 
    return String.format("%,.2f", Double.valueOf(amount)); 
} 

是这种方法的线程安全吗?我没有修改任何其他地方的金额。其次,我有另一种方法。

private boolean checkIfDateIsAHoliday(org.joda.time.LocalDate date) { 
    boolean isHoliday = false; 
    ....... 
    return isHoliday; 
} 

此方法线程安全吗?我不会在其他地方修改日期。

+3

第一种方法是线程安全的,第二种方法......谁知道?这是一个实例方法,因此它可能会修改对象状态或调用另一个非线程安全的实例方法(然后它可能不是线程安全的)。没有代码就没有答案。 – 2014-09-29 10:23:18

+0

你是否在第二种方法中修改任何实例级别/类级别字段?如果它只修改* method-local *变量,那么它是线程安全的。 – TheLostMind 2014-09-29 10:31:32

+0

如果.......线程安全,则第二种方法仅为“线程安全”。你离开了什么? – 2014-09-29 16:59:30

回答

1

线程安全就是访问共享状态。所以,如果你想知道,如果一个方法是线程安全的,你只需要检查它是否访问状态(=字段)也可以通过其他线程访问:

  • 如果不存在这样的状态,你”重新完成 - 该方法是线程安全的。
  • 如果有这样的状态,您必须检查它是否以线程安全方式访问。

(也参见http://tutorials.jenkov.com/java-concurrency/thread-safety.html

不访问任何共享状态的第一方法(String是不可变的,因此参数是线程安全本身)。它调用两个可能访问共享状态的静态方法(String.formatDouble.valueOf)。不幸的是,javadoc没有提及这两种方法的线程安全性。不过,我们可以假设它们(否则几乎所有的Java应用程序都被破坏了)。

您的第二种方法对于我们可以看到的代码是线程安全的(我们不能争论.....背后的代码)。原因:您只是修改本地状态(堆栈变量isHoliday)。由于本地状态不能被其他线程访问,所以根据定义,这是线程安全的。

现在只是试图争论有关其他代码(.....)!

5

一如既往地狱在小细节。你的第一个方法是线程安全的,因为它绝对不会改变任何类的状态。

您的秒数方法仅可部分使用。我不知道你的代码中写的是什么,而不是.......。如果你不改变状态你的任何类那里的方法是线程安全的,否则它不是。

0

对于第一种方法,将是线程安全的,但 这不会是线程安全的,你已经在第二

+2

谨慎解释原因? – Henry 2014-09-29 10:25:33

+0

我的意图是第二种方法可能或不可能是线程安全的,因为我们不知道实际的执行 – santhosh 2014-09-29 10:29:39

+0

@santhosh - 请解释为什么第一个线程安全。 – TheLostMind 2014-09-29 10:32:44

0

第一个声明的方法是线程安全的,因为你只是读一个不可变的变量String

乔达的LocalDate也是不可变的。因此,假设您没有读取或写入可变类或实例字段,则此方法也是线程安全的。