我有一个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;
}
这个方法线程安全吗?我不会在其他任何地方修改日期。
答案 0 :(得分:5)
一如既往地说,细节很小。你的第一个方法是线程安全的,因为它肯定不会改变任何类的状态。
您的秒数方法仅部分可用。我不知道代码中写的是什么,而不是.......
。如果您没有更改任何类的状态,那么该方法是线程安全的,否则不是。
答案 1 :(得分:1)
线程安全就是访问共享状态。因此,如果您想知道方法是否是线程安全的,您只需要检查它是否访问其他线程也可以访问的状态(= fields):
(另见http://tutorials.jenkov.com/java-concurrency/thread-safety.html)
您的第一个方法不访问任何共享状态(String
是不可变的,因此参数本身是线程安全的)。它调用两个可能访问共享状态的静态方法(String.format
和Double.valueOf
)。不幸的是,javadoc没有说明这两种方法的线程安全性。尽管如此,我们可以假设它们是(否则几乎所有的Java应用程序都被破坏了)。
您的第二种方法对于我们可以看到的代码是线程安全的(我们不能争论.....
背后的代码)。原因:您只是修改本地状态(堆栈变量isHoliday
)。由于其他线程无法访问本地状态,因此根据定义,这是线程安全的。
现在试着争论你的其余代码(.....
)!
答案 2 :(得分:0)
对于First方法,它将是Thread safe但是 对于您在第二个
中声明的方法,它不会是线程安全的答案 3 :(得分:0)
第一个是线程安全的,因为您只读取不可变变量String
。
Joda的LocalDate
也是不可改变的。因此,假设您没有读取或编写可变类或实例字段,则此方法也是线程安全的。