class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
在这里,我的疑问是,根据实践,如果您使用易失性,安全的发布方式发生Java并发事件(即,一旦该引用对另一个线程可见,则该数据也将可用)。我可以在这里使用它吗?但是,如果正确,则假定线程1现在检查“资源”,并且它为null,因此开始创建对象。当线程1创建对象时,另一个线程即线程2出现并开始检查“资源”的值,线程2发现它为空(假设创建“资源”对象需要花费大量时间,并且由于线程1尚未完成创建,因此安全发布尚未发生,因此无法用于线程2)那么它将也开始创建对象吗?如果是,则类不变式中断。我对么?请在这里帮助我了解volatile的这种特殊用法。
volatile解决了一个问题,即可见 性问题 。如果您正在写入一个 声明为volatile的 变量 ,
则该值将立即对其他线程可见。众所周知,操作系统L1,L2,L3具有不同级别的缓存,如果我们在一个线程中写入变量,则不能保证对其他线程可见,因此如果我们使用volatile,它会写入直接内存并可见给别人。但是挥发物不能解决
原子性 问题,即int a; a++;
不安全。AS有三个与之关联的机器指令。
问题内容: 在以下简单场景中: x是否需要挥发?我知道同步保证了原子性,但是我不确定可见性…是否执行锁->修改->解锁->锁保证,第二个锁之后x的值将为“新鲜”? 问题答案: 不,不是,已 同步 已在其后插入了内存屏障,因此考虑到其他线程将在同一锁上进行同步,所有线程将看到当前线程执行的更新。 就像同步的一样,易失性具有附加的内存屏障-根据CPU的不同,它是存储/加载/完全屏障,可确保一个线程的更
问题内容: 可变布尔不能实现的AtomicBoolean有什么作用? 问题答案: 他们是完全不同的。考虑以下volatile整数示例: 如果两个线程同时调用该函数,则i之后可能为5,因为编译后的代码与此类似(除非你无法在上同步int): 如果变量是易失性的,则对它的每个原子访问都是同步的,但是实际上什么才算是原子访问并不总是很明显。对于一个对象,可以保证每种方法都是“原子的”。 因此,如果使用,则
问题内容: 我有一个缓存类,其中包含一个存储缓存项。 我很好奇更改为会带来什么后果? 我会提高性能吗?此缓存是只读缓存。 最佳选择是什么?只是HashMap?缓存将按一定间隔进行填充。 问题答案: 首先,您似乎不了解关键字的作用。它确保如果声明的变量保留的 引用值发生更改,则其他线程将看到它,而不是拥有缓存的副本。它与访问线程安全无关。 鉴于此,并且您说的是只读事实,您当然不需要使用任何提供线程安
问题内容: 这是一个简单的错误开始的:我使用的不是对象的格式字符串。但是我对使用格式错误的字符串的测试结果完全感到困惑。 这段代码: 产生以下输出: 我在这里阅读了有关’Y’参数的文档:https : //docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html,但是我仍然看不到在这里工作。特别是最后一种情况:我可以有点理
问题内容: 我一直在尝试各种示例,以使自己熟悉AsyncTask。到目前为止,我所看到的所有示例都将AsyncTask包含在主要活动的onCreate方法中。我不太喜欢,所以我想看看将其分成自己的班级会有多困难。到目前为止,我有这个: 的 主要活动 新的单独的 AsyncTask类 最初,这些都在主要活动中,因此提到了asynctask在理论上应该更新的要素。显然,目前这会导致运行时错误,这让我开
在Java(仅限)Play 2.3项目中,我们需要将的非分块响应直接发送到客户端。来自一个远程服务,我们希望从该服务直接流到客户端,而不阻塞或缓冲本地文件。因为我们在读取输入流之前就知道了大小,所以我们不想要分块的响应。 对于已知大小的输入流,返回结果的最佳方法是什么?(最好不使用Scala)。 查看默认的