当前位置: 首页 > 知识库问答 >
问题:

防御性复制是否足以从可变线程不安全的类创建不可变线程安全的类?

农飞星
2023-03-14
import java.util.Date;

public class Person {
    private final String name;
    private final Date birthDate;
    ...
    public Person(final String name, final Date birthDate, ...) {
        this.name = name;
        this.birthDate = new Date(birthDate.getTime());
        ...
    }
    ...
}

有没有其他的方法来保证线程安全呢?

共有1个答案

单昊穹
2023-03-14

是的,理论上,传入的出生日期可以在对Person构造函数的调用和防御副本之间更改。这将假设birthDate值不是线程安全的。通常情况下,如果您担心这一点,您会在它周围放置一个同步块,以确保不会发生这种疯狂的情况。因为同步也会围绕Person构造函数扩展,所以您会得到很好的保护。

您只需要围绕构造函数调用进行同步。一旦构建了它,防御副本就存在了,其他Person方法也是线程安全的。

线程安全可以通过多种方式实现--防御性复制、同步、使用javax.concurrency包或者只是适当的设计。这些都有不得不理解的弱点。

 类似资料:
  • 问题内容: 好吧,考虑下面给出的不可变类: 现在,我正在一个类中创建一个对象,该对象的对象将由多个线程共享: 看到as 并移入同步块并创建对象。现在,由于 Java内存模型(JMM)允许多个线程在初始化开始之后但尚未结束之前观察对象。 因此,可以将写入操作视为在写入的字段之前发生。因此,因此可以看到部分构造,该构造很可能处于无效状态,并且其状态以后可能会意外更改。 它不是非线程安全的吗? 编辑 好

  • 关于一次从多个线程访问局部变量的几个问题: > < li> 我有多个线程写入和读取变量值,我是否应该同步访问它? 变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。 如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题? 我应该为此使用volatile吗? 编辑: 我想强调的是,我没有任何并发问题。这是我的具体方案: 一个。我的变量名称是 ,它测量 p

  • 类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是

  • 我得到的是它们是线程安全的。 杰里米·曼森博客的片段- 因为this引用存储在lastconstructed中“,因此转义构造函数 请建议。

  • 在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为——我有一个SelectionKey,通过调用(使用调试器)它的interestTops()方法,返回值是1(READ),但当我将数据发送到与该键对应的套接字时,选择器不会被唤醒。。 如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。 在给定的时间内,我只有一个线程处理一个连接,但

  • 问题内容: 我一直在假设线程安全也不是线程安全,但是在最近的一次讨论中,一位同事告诉我线程安全。 因此,我做了一些研究,却一无所获。很多人认为它是线程安全的,很多人认为它不是线程安全的。而且,最重要的是,文档没有以一种或另一种方式说任何话,不是为了,甚至不是。 那是什么呢? 问题答案: 这是指向Java 7 中Calendar和GregorianCalendar的源代码的链接。 如果阅读该代码,您