Java:volatile关键字和static的区别
## 简介 ``volatile``在Java中,是一个关键字,只能用于修饰属性,作用是保证数据一致
渲染中...
## 简介 ``volatile``在Java中,是一个关键字,只能用于修饰属性,作用是保证数据一致性,是一种线程安全的简单实现。 <!-- more --> ## 与`static`比较 理论上讲,`static`修饰的属性,在全局中只有一个内存,无论何时何地何处,读取其属性值,都是那一个内存,那么起作用是不是与`volatile`作用一样呢? - `volatile`声明变量值的一致性;`static`声明变量的唯一性。 ## 与`synchronized`比较 既然说到了线程安全,就不得不讲讲`synchronized`关键字了。 - `volatile` 关键字是线程同步的轻量级实现,所以 `volatile` 性能肯定要比 `synchronized` 关键字好; - `volatile` 关键字只能修饰变量,而 `synchronized` 关键字可以修饰方法以及代码块; - 多线程访问 `volatile` 关键字不会发生阻塞,而 `synchronized` 关键字可能会发生阻塞; - `volatile` 关键字是保证数据的可见性,但不保证数据的原子性,而 `synchronized` 关键字两者都能保证; - `volatile` 关键字解决的是变量在多个线程之间的可见性,而 `synchronized` 关键字解决的是多个线程间访问资源的同步性。 ## `volatile`的真实作用 `volatile`的真实作用是:**防止Java指令重排序!** Java自身有一个机制:在某些情况下,改变代码执行顺序,不会改变其最终的结果,这类代码在Java底层编译执行时,可能会自动进行重新排序,并不严格按照代码的编写顺序去执行。这种机制一般称之为**Java指令重排序**。 > ps:想要详细了解Java指令重排序可自行百度。 有时,Java指令重排序会导致预料之外的代码逻辑bug,当出现这种情况时,可以对确定不希望重排序的代码增加`volatile`关键字。
END
评论
登录后查看和发表评论
前往登录