V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tuzhenyu
V2EX  ›  问与答

关于 Java 多线程的几点疑问,求助大佬

  •  1
     
  •   tuzhenyu · 2017-10-14 10:35:15 +08:00 · 1092 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 多线程的线程安全需要保证原子性和可见性,volatile 关键字可以保证可见性不能保证原子性,synchronized 关键字可以保证可见性和原子性,不过有几点疑问请教一下大佬:

    (1)volatile 关键字如何保证的可见性,在书上和博客上看到了两种不同的说法,不知道哪种正确:

    1.赋值操作后会立即写回主内存,一个线程数据回写到主内存会导致其他线程对应数据无效(通过嗅探总线上传输的数据检查自身数据),线程下次使用时若发现自身数据失效,则会从主内存上取数据更新;

    2.线程中每次 use 变量时,都需要连续执行 read->load->use 几项操作保证使用的数据是最新的,线程每次 assign 变量时,都需要连续执行 assign->store->write 几项操作,保证赋值后立即写回主内存;

    (2)未使用 volatile 关键字的普通变量赋值后工作内存写回主内存的时机: volatile 关键字修饰的变量赋值语句后会立即写回主内存,普通变量赋值修改后什么时候写回主内存呢,是当一个方法执行完后吗?

    (3)volatile 使用内存屏障解决指令重排序带来的线程安全问题,synchronized 是怎么解决指令重排序带来的线程安全问题的呢?

    1 条回复    2017-10-16 10:22:34 +08:00
    petelin
        1
    petelin  
       2017-10-16 10:22:34 +08:00
    第二点, 普通变量写会内存的时间就是那条语句执行完之后啊, 这样线程也是不安全的.

    其他不会, 求大佬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5035 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 160ms · UTC 03:57 · PVG 11:57 · LAX 20:57 · JFK 23:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.