我的静态util方法线程是否安全

时间:2014-09-29 10:20:25

标签: java multithreading

我有一个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;
}

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

线程安全就是访问共享状态。因此,如果您想知道方法是否是线程安全的,您只需要检查它是否访问其他线程也可以访问的状态(= fields):

  • 如果没有这样的状态,那么你就完成了 - 这个方法是线程安全的。
  • 如果 这样的状态,则必须检查是否以线程安全的方式访问它。

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

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

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

现在试着争论你的其余代码(.....)!

答案 2 :(得分:0)

对于First方法,它将是Thread safe但是 对于您在第二个

中声明的方法,它不会是线程安全的

答案 3 :(得分:0)

第一个是线程安全的,因为您只读取不可变变量String

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