java Volatile与Synchronized

介绍Volatile变量之前,我们需要了解一下两个概念:

    如何保证线程中数据的一致性呢,首先我们可以利用synchronize同步操作,即多个线程在同一个时间内只能有一个线程访问该资源变量,这样保证了原子性的操作,同时,我们还有另外一种方法,即我们在线程操作的同时,可以将处理完的结果给到另外一个也是正在处理该数据的线程,保证资源的可见性,这时候就是利用的volatile。

Volatile变量:

    本质在于告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中去读取。synchronize则是将该变量锁住,不让你能被其他线程访问。

    volatile只能使用在变量中,synchronize可是使用在方法和变量上。

 

    Volatile变量具有synchronize的可见,但是不具有原子性。

    因此只有在状态真正独立于程序内其他内容时才能使用 volatile —— 这条规则能够避免将这些模式扩展到不安全的用例。

使用volatile需要具备以下两个特征:

  • 对变量的写操作不依赖于当前值。

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

  • volatile会禁止指令重排。

 

有序性:

    即程序执行时按照代码书写的先后顺序执行,在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性

转载于:https://my.oschina.net/u/4189935/blog/3094723

你可能感兴趣的:(java)