加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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的实例,请考虑使用ThreadLocal方便地为每个线程使用单独的实例,这样可以删除同步:

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读