什么是多线程环境下的伪共享(false sharing)?

这篇具有很好参考价值的文章主要介绍了什么是多线程环境下的伪共享(false sharing)?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java中,伪共享(false sharing)是指多线程环境下,由于缓存一致性协议的影响,不同线程访问同一缓存行中的不同数据造成的性能下降现象。当多个线程同时访问不同变量,但这些变量存储在同一缓存行中时,每个线程只修改自己的变量,但由于缓存一致性协议的要求,需要将整个缓存行的数据进行更新,导致其他线程缓存的数据失效,从而影响了性能。

接下里笔者用一段简单的Java代码,来演示下伪共享的效果:

public class FalseSharingDemo implements Runnable {
    private static final int NUM_THREADS = 2;
    private static final long ITERATIONS = 500000000L;
    private static final int ARRAY_SIZE = 8;

    private static VolatileLong[] longs = new VolatileLong[ARRAY_SIZE];

    static {
        for (int i = 0; i < ARRAY_SIZE; i++) {
            longs[i] = new VolatileLong();
        }
    }

    private final int arrayIndex;

    public FalseSharingDemo(int arrayIndex) {
        this.arrayIndex = arrayIndex;
    }

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[NUM_THREADS];

        for (int i = 0; i < NUM_THREADS; i++) {
            threads[i] = new Thread(new FalseSharingDemo(i));
        }

        for (Thread t : threads) {
            t.start();
        }

        for (Thread t : threads) {
            t.join();
        }
    }

    public void run() {
        long i = ITERATIONS + 1;
        while (--i > 0) {
            longs[arrayIndex].value = i;
        }
    }

    public static class VolatileLong {
        public volatile long value = 0L;
    }
}

在上面的示例代码中,我们创建了一个包含多个VolatileLong对象的数组。每个VolatileLong对象都包含一个volatile修饰的long类型的变量。在run()方法中,每个线程都会通过循环将自己的索引对应的VolatileLong对象的value字段设置为递减的值。

当我们运行该示例代码时,由于VolatileLong对象存储在同一缓存行中,不同线程对不同的VolatileLong对象进行操作,但由于缓存一致性协议的要求,每次写操作都会导致整个缓存行的数据失效。这将引起多个线程之间频繁的缓存行无效和更新,导致性能下降。

为了解决伪共享问题,可以使用填充(padding)技术来确保不同变量在不同的缓存行中,从而避免了不必要的缓存行无效和更新。可以通过在VolatileLong类中增加填充字段来解决伪共享问题,例如:

public static class VolatileLong {
    public volatile long value = 0L;
    public long padding1, padding2, padding3, padding4, padding5, padding6;
}

通过在VolatileLong类中添加填充字段,可以将不同的VolatileLong对象分散到不同的缓存行中,从而避免了伪共享带来的性能下降。文章来源地址https://www.toymoban.com/news/detail-691536.html

到了这里,关于什么是多线程环境下的伪共享(false sharing)?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Springboot】什么是多环境开发?

    那什么是多环境开发?就是针对不同的环境设置不同的配置属性即可。比如你自己开发时,配置你的端口如下: 如何想设计两组环境呢?中间使用三个减号分隔开 如何区分两种环境呢?起名字呗 在idea的配置文件中配置了这三个环境,下面的Document会显示1or2or3/3 那用哪一个呢

    2024年02月10日
    浏览(35)
  • JAVA中的伪共享与缓存行

    1.CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行。 主内存(RAM)是数据存放的地方,CPU 和主内存之间有好几级缓存,因为即使直接访问主内存也是非常慢的。 CPU的速度要远远大于内存的速度,为了解决这个问题,CPU引入了三级缓存:L1,L2和L3三个级别

    2024年02月12日
    浏览(35)
  • Redis到底是多线程还是单线程?

            Redis 是非常的快的!Redis 是基于内存操作,CPU 不是 Redis 性能瓶颈,内存和网络带宽(因为 IO 时需要使用)才是 Redis 的性能瓶颈。 Redis 为什么不使用多线程?         因为在多线程的情况下,CPU会在多个线程之间切换 (上下文切换) 是需要耗时的,大概为 15

    2024年02月01日
    浏览(35)
  • 有关多线程环境下的Volatile、lock、Interlocked和Synchronized们

    📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香! 📢本文作者:由webmote 原创 📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 ! 多线程下的变量访问,就如同

    2024年02月08日
    浏览(36)
  • 什么是多播

    我就问了几下chatGPT他就给我生成了一篇文章,看着还有理有据 多播(Multicast)是一种网络通信方式,可以将数据传输到一组特定的接收者。与单播(Unicast)和广播(Broadcast)不同,多播只向特定的一组接收者发送数据,而不是向所有的接收者发送数据。多播通常用于视频会

    2024年02月12日
    浏览(51)
  • 【Redis】-使用Lua脚本解决多线程下的超卖问题以及为什么?

    一.多线程下引起的超卖问题呈现 1.1.我先初始化库存数量为1、订单数量为0 1.2.然后我开启3个线程去执行业务 业务为:判断如果说库存数量大于0,则库存减1,订单数量加1 结果为:库存为-2,订单数量为3 原因:如下图所示,这是因为分别有6个指令(3个库存减1指令,3个订单

    2024年02月03日
    浏览(51)
  • 什么是多接入边缘计算?(多接入边缘计算是什么意思?)

    多接入边缘计算 (MEC) 将流量和服务计算从集中式云迁移至网络边缘,更贴近客户。网络边缘分析、处理并存储所有数据,而不是将其发送至云端进行处理。更贴近客户收集并处理数据可减少延迟,为高带宽应用提供实时性能。 MEC特征有什么: 相近性 超低延迟 高带宽 虚拟化

    2024年02月13日
    浏览(46)
  • 机器学习笔记 - 什么是多模态深度学习?

            人类使用五种感官来体验和解释周围的世界。我们的五种感官从五种不同的来源和五种不同的方式捕获信息。模态是指某事发生、经历或捕捉的方式。         人工智能正在寻求模仿人类大脑,终究是跳不出这具躯壳的限制。         人脑由可以同时处理

    2024年02月09日
    浏览(40)
  • Web3知识科普:什么是多签钱包?

    我们日常使用的HD(身份)钱包或多链钱包,通常只可以通过一个公钥进行存储。这意味着,无论是谁,只要获悉了与该公钥匹配的私钥,就能够支配该公钥链上所持有的资产。所以为了解决密钥的问题,多重签名技术应运而生。 今天我们就来讲讲多重签名机制的含义、作用

    2024年02月11日
    浏览(45)
  • 秘密共享(Secret Sharing,SS)

        秘密共享是一种重要密码学工具用于构建安全多方计算,其在诸多多方安全计算协议中被使用,例如拜占庭协议、多方隐私集合求交协议、阈值密码学等。 本文首先介绍秘密共享的概念,其次介绍秘密共享生成(基于不同的生成方式我们将其划分为基于位运算的加性秘密

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包