V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oldshensheep
V2EX  ›  程序员

关于多线程编程的问题

  •  
  •   oldshensheep ·
    oldshensheep · 2023-02-03 15:12:40 +08:00 · 1673 次点击
    这是一个创建于 448 天前的主题,其中的信息可能已经有所发展或是发生改变。

    多线程编程有许多问题……这是一些复现这些问题的例子。
    具体为什么会出现这些问题就不多说了……

    指令重排( Instruction reordering)

    多线程访问共享变量的顺序可能不是你代码写的顺序。

    例子 https://stackoverflow.com/questions/52648800/how-to-demonstrate-java-instruction-reordering-problems

    可见性问题(Visibility)

    多线程修改一个变量,另一个线程读取的可能是修改前的值

    学 Java 的应该都知道的一个例子,单例模式中的双重检查锁(Double checked locking)。
    还有一个例子,在上面 stackoverflow 网站中给出的例子当中代码执行出乎意料,其实也有可能是内存可见性的问题。
    在评论中也有人指出了这个问题。不过在 X86 中不存在可见性问题。

    虚假唤醒(Spurious wakeup)

    线程会莫名其妙的被唤醒

    例子 https://www.v2ex.com/t/902578 见回复简化的例子 https://www.v2ex.com/t/902578#r_12468983

    伪共享(False sharing)

    多线程访问同一个缓存行,导致缓存频繁失效。

    例子 https://jenkov.com/tutorials/java-concurrency/false-sharing.html
    去掉 @jdk.internal.vm.annotation.Contended 和不去掉的运行时间差别非常大。40s -> 6s

    原子性

    多线程读取修改同一个变量,修改会被相互覆盖。

    Int a = 0
    
    Thread 1 : 
    for 0 to 100:
        a=a+1
    
    Thread 2 : 
    for 0 to 100:
        a=a+1
    

    最后的结果不一定是 200

    4 条回复    2023-02-03 16:14:16 +08:00
    amlee
        1
    amlee  
       2023-02-03 15:26:20 +08:00
    你不都自问自答了吗?哪还有问题
    oldshensheep
        2
    oldshensheep  
    OP
       2023-02-03 15:29:31 +08:00
    @amlee 啊?我就是分享一下
    lzj724
        3
    lzj724  
       2023-02-03 15:40:48 +08:00
    还有 MESI 协议
    x02
        4
    x02  
       2023-02-03 16:14:16 +08:00
    帖子应该构成一个讨论, 否则你可以发到自言自语板块, 又或者你可以发到分享板块

    而且你发的这些应该不是多线程而是并发问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   980 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:56 · PVG 03:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.