繁体   English   中英

用于任意可克隆数据的线程安全持有者

[英]A thread-safe holder for arbitrary cloneable data

我有一个带有public clone()方法的SomeMutableData类。 我想确保没有线程看到不一致的状态(假设实例将仅使用持有者传递)。 我认为使用同步是最安全的可能,对吗?

public final class ThreadSafeHolder {
    public ThreadSafeHolder(SomeMutableData data) {
        storeData(data);
    }

    public synchronized SomeMutableData cloneData() {
        return data.clone();
    }
    public synchronized void storeData(SomeMutableData data) {
        this.data = data.clone();
    }

    private SomeMutableData data;
}

以下是第一种方法安全吗?

public final class ThreadSafeHolder2 {
    public ThreadSafeHolder2(SomeMutableData data) {
        storeData(data);
    }

    public SomeMutableData cloneData() {
        return data.get().clone();
    }
    public void storeData(SomeMutableData data) {
        this.data.set(data.clone());
    }

    private final AtomicReference<SomeMutableData> data
        = new AtomicReference<SomeMutableData>();
}

由于clone()比同步更昂贵,因此从性能的角度来看几乎不重要。

但是,第二个示例是线程安全且速度稍快。

唯一的区别是你能做到的第一个例子。 (不管你喜欢与否;)

synchronized(theHolder) {
    SomeMutableData smd = theHolder.cloneData();
    smd.updateIt();
    theHolder.storeData(smd);
}

顺便说一句:我不认为持有人应该延长包装的类型。

编辑:更友好的GC方式是使用以下方法。 您可以编写copyFrom(),这样就不会创建设置或获取数据的对象。

public final class ThreadSafeHolder {
    private final SomeMutableData data = new SomeMutableData();

    public ThreadSafeHolder(SomeMutableData data) {
        copyFrom(data);
    }

    public synchronized void copyTo(SomeMutableData data) {
        data.copyFrom(this.data);
    }

    public synchronized void copyFrom(SomeMutableData data) {
        this.data.copyFrom(data);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM