java – 多线程处理中静态成员的意外行为
发布时间:2020-12-15 04:22:29 所属栏目:Java 来源:网络整理
导读:我已经解决了随机多线程处理的问题.我很高兴,因为它有效,但我想知道为什么.以下代码中的错误成员称为INPUT_SDF.我认为静态最终成员不需要同步块,但是当我删除它时,一切都会出错. public class A implements ComparableA{ public static final SimpleDateForm
我已经解决了随机多线程处理的问题.我很高兴,因为它有效,但我想知道为什么.以下代码中的错误成员称为INPUT_SDF.我认为静态最终成员不需要同步块,但是当我删除它时,一切都会出错.
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); } } } 我对静态最终成员的理解是错误的吗?或者我的代码中还有其他东西不是线程安全的吗? 解决方法
使一个字段静态最终只使参考线程安全;它不会同步对引用对象的访问.
因为SimpleDateFormat的实例不是线程安全的,如果多个线程同时使用实例,则必须同步对它的访问(如您所做). 使字段静态最终确保所有线程都会看到相同的引用值. 但是,您当前的代码是一个潜在的瓶颈,因为所有线程必须排队使用该实例,可能会产生比每次创建新实例更差的性能. 如果要安全地重用SimpleDateFormat的实例,请考虑使用 private static final ThreadLocal<SimpleDateFormat> formats = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss",Locale.US); } }; public void setDate(String string) throws ParseException { return formats.get().parse(string); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |