gpt4 book ai didi

java - 多线程处理中静态成员的意外行为

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:52 25 4
gpt4 key购买 nike

我解决了一个随机多线程处理的问题。我很高兴,因为它有效,但我想知道为什么。下面代码中的错误成员称为 INPUT_SDF。我认为静态最终成员不需要同步块(synchronized block),但是当我删除它时,一切都出错了。

public class A implements Comparable<A>
{

public static final SimpleDateFormat INPUT_SDF = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss", Locale.US);

...

public void setDate(String string) throws ParseException
{
synchronized (INPUT_SDF)
{
date = INPUT_SDF.parse(string);
}
}

}

我对静态最终成员的理解有误吗?还是我的代码中有其他东西不是线程安全的?

最佳答案

没有使字段静态最终不足以使代码线程安全。它只会使对对象线程的引用分配安全,从而确保其他线程将在该字段中看到相同的对象引用。它不会对存储在字段中(分配后)线程安全的对象中存储的数据进行突变。这是 SimpleDataFormat 的问题。

来自 SimpleDateFormat 的文档.

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

如果 SimpleDateFormat 是无状态的,或者写成使其状态是线程安全的,那么 yes static final 就足以成为线程安全的。

实际上,如果想在线程之间共享同一个 SimpleDataFormat 实例,就必须先将线程与同一个监视器同步。否则建议为每个线程创建一个新的 SimpleDateFormat 实例,根据需要创建一个新实例或使用 ThreadLocal 或类似机制。

关于java - 多线程处理中静态成员的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25885422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com