java - Java 中对象的线程安全复制

标签 java multithreading thread-safety synchronized

我有一个类似于以下类的静态数组:

public class Entry {
    private String sharedvariable1= "";
    private String sharedvariable2= "";
    private int sharedvariable3= -1;

    private int mutablevariable1 = -1
    private int mutablevariable2 = -2;

    public Entry (String sharedvariable1, 
                  String sharedvariable2, 
                  int sharedvariable3) {
        this.sharedvariable1 = sharedvariable1;
        this.sharedvariable2 = sharedvariable2;
        this.sharedvariable3 = sharedvariable 3;
    }

    public Entry (Entry entry) {  //copy constructor. 
        this (entry.getSharedvariable1, 
              entry.getSharedvariable2, 
              entry.getSharedvaraible3);
    }
....
/* other methods including getters and setters*/
}

在我的程序中的某个时刻,我访问了这个对象的一个​​实例,并使用上面的复制构造函数制作了一个副本。然后我更改上面两个可变变量的值。该程序在多线程环境中运行。 请注意。所有变量都在线程化之前设置了它们的初始值。 只有在程序线程化后,才会创建一个副本,变量才会更改。我相信它是线程安全的,因为我只读取静态对象,而不是写入它(即使是共享变量 3,尽管只读取 int 和 mutable)并且我只更改静态对象的副本(和正在线程内进行复制)。但是,我想在这里确认我的想法是正确的。

有人可以评价一下我在做什么吗?

最佳答案

它不是线程安全的。您需要包装任何修改共享变量的东西:

synchronized (this) {
    this.sharedvariable1 = newValue;
}

对于 setter,你可以这样做:

public synchronized void setSharedvariable1(String sharedvariable1) {
    this.sharedvariable1 = sharedvariable1;
}

然后在你的复制构造函数中,你会做类似的事情:

public Entry (Entry entry) {
    this();
    synchronized(entry) {
        this.setSharedvariable1(entry.getSharedvariable1());
        this.setSharedvariable2(entry.getSharedvariable2());
        this.setSharedvariable3(entry.getSharedvariable3());
    }
}

这确保如果正在对实例进行修改,则复制操作将等到修改完成。

关于java - Java 中对象的线程安全复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191465/

相关文章:

Java错误: cannot find symbol

java - 如何从页面使用 Solrj 重新启动 SOLR 搜索?

linux - 使用 C 中的 pthread 保持线程数恒定

multithreading - 在 Servlet 中使用线程

c - 将参数作为空指针传递给 OS-iii 中的新线程

ios - Objective C - 将对象添加到数组,同时改变该对象

java - 多个(甚至可能未使用的)jar文件的大型类路径效率低下

java - 将 DOCX 转换为 XML 文件

ruby - 使用 .each/iterator 的线程安全 Ruby 队列

Swing 线程中的 Java 操作