当前位置: 首页 > 面试题库 >

挥发性背piggy。这足以引起人们的注意吗?

蓝鸿哲
2023-03-14
问题内容

这是关于易失性piggy带。目的:我想达到轻量级的vars可见性。a_b_c的一致性并不重要。我有一堆var,我不想让它们都变得不稳定。

此代码是线程安全的吗?

class A {
    public int a, b, c;
    volatile int sync;

    public void setup() {
        a = 2;
        b = 3;
        c = 4;
    }

    public void sync() {
        sync++;
    }
}

final static A aaa = new A();

Thread0:
aaa.setup();
end

Thread1:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}

Thread2:
for(;;) {aaa.sync(); logic with aaa.a, aaa.b, aaa.c}

问题答案:

Java内存模型定义了 事前发生 关系,具有以下属性(以及其他属性):

  • “线程中的每个动作均发生在该线程中的每个动作之后,它们在程序顺序中排在后面”(程序顺序规则)
  • “发生对易失性字段的写操作-在每次随后读取相同的易失性之前”(易失性变量规则)

这两个属性以及 之前发生的 关系的可传递性意味着OP以下列方式寻求的可见性保证:

  1. 写于a螺纹1 之前发生 一个写sync在调用sync()在线程1(程序顺序规则)。
  2. sync在对线程2 的调用(易变变量规则)中的读取操作 之前,发生sync()对线程1 的调用中的写入操作。 __sync``sync
  3. 从读sync在调用sync()中的线程2 之前发生 的读取距离a在2线(程序顺序规则)。

这意味着,这个问题的答案是肯定的,即呼吁sync()在线程1和2,确保变更的知名度每次迭代ab并且c给其他线程(或多个)。请注意,这仅确保可见性。不存在互斥保证,因此所有不变量都具有约束力ab并且c可能被违反。

另请参阅Java理论和实践:修复Java内存模型,第2部分。特别是“挥发性的新保证”部分说

在新的内存模型下,当线程A写入易失性变量V,而线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。



 类似资料:
  • 问题内容: 我有一个缓存类,其中包含一个存储缓存项。 我很好奇更改为会带来什么后果? 我会提高性能吗?此缓存是只读缓存。 最佳选择是什么?只是HashMap?缓存将按一定间隔进行填充。 问题答案: 首先,您似乎不了解关键字的作用。它确保如果声明的变量保留的 引用值发生更改,则其他线程将看到它,而不是拥有缓存的副本。它与访问线程安全无关。 鉴于此,并且您说的是只读事实,您当然不需要使用任何提供线程安

  • 我在wordpress中的裁剪图像中发现了一个奇怪的bug 我使用WP_Customize_crapped_Image_控件来裁剪图像。在那里我设置了750的宽度 这很好,但在裁剪其他图像时显示错误 *这让我发疯,花了这么多小时后,我意识到(错误,不显示裁剪帧)它发生与图像具有相同的宽高比,我在WP_Customize_Cropped_Image_Control提供(如果宽高比匹配,然后发生错误)

  • 问题内容: 在以下简单场景中: x是否需要挥发?我知道同步保证了原子性,但是我不确定可见性…是否执行锁->修改->解锁->锁保证,第二个锁之后x的值将为“新鲜”? 问题答案: 不,不是,已 同步 已在其后插入了内存屏障,因此考虑到其他线程将在同一锁上进行同步,所有线程将看到当前线程执行的更新。 就像同步的一样,易失性具有附加的内存屏障-根据CPU的不同,它是存储/加载/完全屏障,可确保一个线程的更

  • 我已经解决了hackerrank Sock Merchant问题,但我想降低代码的复杂性(我不确定这是否可能)。 约翰在一家服装店工作。他有一大堆袜子,必须按颜色配对出售。给定一个表示每只袜子颜色的整数数组,确定有多少双颜色匹配的袜子。 在下面的编辑器中完成sockMerchant函数。它必须返回一个整数,表示可用的匹配socks对的数量。 sockMerchant具有以下参数: > n:袜子堆中

  • 当你阅读本书的时候,我们希望听到你们对它的评论。 它是否有用? 它写得好嘛? 你有没有发现一些要更正的东西? 有什么缺少的东西? 有什么想要深入了解的东西? 有什么不想看的东西? 如果你确实觉得本书相当不错,请为它发推,并且向你的朋友推荐本书。

  • 问题内容: 可变布尔不能实现的AtomicBoolean有什么作用? 问题答案: 他们是完全不同的。考虑以下volatile整数示例: 如果两个线程同时调用该函数,则i之后可能为5,因为编译后的代码与此类似(除非你无法在上同步int): 如果变量是易失性的,则对它的每个原子访问都是同步的,但是实际上什么才算是原子访问并不总是很明显。对于一个对象,可以保证每种方法都是“原子的”。 因此,如果使用,则