【发布时间】:2015-08-15 09:23:35
【问题描述】:
例如:
static private DateFormat df = new SimpleDateFormat();
public static void format(final Date date) {
for (int i = 0; i < 10; i++)
new Thread(new Runnable() {
public void run() {
System.out.println(df.format(date));
}
});
}
DateFormat 类被记录为不是同步类,但是如果我们只使用格式方法,它不能改变整个类的状态吗?
假设它被声明为私有,如何确定代码是线程安全的?
修复此代码的最佳方法是什么?:
为每个线程使用不同的实例。
使用同步块。
【问题讨论】:
-
通过仔细阅读文档,无论是类文档还是具体方法文档。
-
DateFormat 特别提到它不是线程安全的,如果我没记错的话。
-
好吧,记录为非同步类,如果我们只使用格式方法,它不能改变洞类的状态吗?
-
如果一个类被记录为非线程安全的,就像 DateFormat 一样,你就不要再猜测哪种方法实际上可能是线程安全的,也可能不是。您只是不在多个线程之间共享实例。顺便说一句,format() 改变或不改变状态的事实是无关紧要的:如果同时调用另一个方法,并且该方法改变了状态,那么 format() 将破坏其不变量,并可能返回错误的结果,或抛出异常,或其他任何东西。
-
阅读方法的源代码并了解它是如何工作的会很有用,而且源代码可以在 Internet 上免费获得。但是,您不能依赖实现在版本中保持不变。如果你的程序不允许任何其他线程接触一个对象,你为什么要关心线程安全?
标签: java multithreading thread-safety