我得到的是它们是线程安全的。
杰里米·曼森博客的片段-
class String {
// Don't do this, either.
static String lastConstructed;
private final byte[] bytes;
public String(byte[] value) {
bytes = new byte[value.length];
System.arraycopy(value, 0, bytes, 0, value.length);
lastConstructed = this;
}
}
因为this引用存储在lastconstructed中“,因此转义构造函数
请建议。
一个常见的误解是在Java中有对象字段。您只有引用和原语。这意味着
static String lastConstructed;
字段lastconstructed
是一个可变引用。它的可见性不是线程安全的。具有不可变对象不会赋予对该对象的引用任何属性。
类似地,如果您有final
字段,这不会使您的对象变得不可变。
final Date today = new Date();
volatile Date now = new Date();
now.setTime(System.currentTimeMillis()); // no thread safe.
这不是线程安全的原因有两个。1)对now
的访问是读而不是写,其次,它在任何情况下都发生在写之前。所需要的是写之后的屏障。你看到的东西看起来是无稽之谈。
now = now; // this adds a write barrier.
一个相关的神话是,如果您使用线程安全的集合,那么您执行的任何一系列操作也是线程安全的。这有点像仙女的灰尘,你只是洒在周围,你的许多虫子消失了,但这并不意味着你真的是线程安全的。
简而言之,线程安全就像一个依赖关系链,如果访问数据的任何方面不是线程安全的,就没有一个是。
类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是
问题内容: 我试图基于初始化按需持有人习惯用法创建一个线程安全的单例类。这是我的代码 我的期望是以线程安全的方式初始化ExecutorService,并且那里只有一个实例(静态)。 这段代码是实现了这一目标-还是需要任何更改? 问题答案: 根据SEI 指南,您的方法很好。 但是,由于我们有枚举,因此可以使用枚举的简单方法: 而且,如果您想变得真正聪明,还可以定义枚举实现的接口。因为这样您以后可以
问题内容: 好吧,考虑下面给出的不可变类: 现在,我正在一个类中创建一个对象,该对象的对象将由多个线程共享: 看到as 并移入同步块并创建对象。现在,由于 Java内存模型(JMM)允许多个线程在初始化开始之后但尚未结束之前观察对象。 因此,可以将写入操作视为在写入的字段之前发生。因此,因此可以看到部分构造,该构造很可能处于无效状态,并且其状态以后可能会意外更改。 它不是非线程安全的吗? 编辑 好
关于一次从多个线程访问局部变量的几个问题: > < li> 我有多个线程写入和读取变量值,我是否应该同步访问它? 变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。 如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题? 我应该为此使用volatile吗? 编辑: 我想强调的是,我没有任何并发问题。这是我的具体方案: 一个。我的变量名称是 ,它测量 p
问题内容: 我正在使用静态代码块来初始化我拥有的注册表中的某些控制器。因此,我的问题是,我可以保证在首次加载该类时,该静态代码块仅被绝对调用一次吗?我知道我不能保证何时将调用此代码块,我猜是在Classloader首次加载时。我意识到我可以在静态代码块中的类上进行同步,但是我猜这实际上是怎么回事? 简单的代码示例将是; 还是我应该这样做? 问题答案: 是的,Java静态初始化器是线程安全的(使用第
有没有其他的方法来保证线程安全呢?