永刚的点滴成长

导航

 

两条规定

  1、线程对共享变量所有的操作都必须在自己的工作内存中进行,不能直接从主内存中读取。

  2、不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来进行。

voltaile实现内存的可见性

  深入来说是通过加入内存屏障和禁止重排序优化来实现的

  1、对volatile修饰的变量执行写操作时,会在写操作后加一条store屏障指令

  2、对volatile修饰的变量执行都操作时,会在读操作之前load屏障指令

  volatile修饰的变量不能保证原子性,只能保证可见性。

  多线程中安全的使用volatile变量,必须同时满足以下两个条件:

  1、对变量的写入操作不依赖当前的值。

  2、该变量没有包含在具有其他变量的不变式中。

volatile和synchronized的区别

  volatile本质是告诉虚拟机当前对象的在工作内存的值是不确定的,需要从主内存获取,synchronized是下对象只能被当前线程读或写,其他线程是被阻塞在同步块之外的,当前线程完成后其他线程才能排队操作变量;

  volatile仅仅能作用在变量而synchronized可以用在变量方法和类级别;

  volatile仅仅能够保证变量的可见性不能保证原子性;synchronized可以保证变量修改的可见性和原子性;

  volatile修饰的变量不能被编译器优化(禁止重排序),synchronized修饰的可以被编译器优化;

  volatile不会造成线程阻塞,synchronized可能造成线程阻塞;

posted on 2019-08-11 20:09  永刚的点滴成长  阅读(199)  评论(0)    收藏  举报