java中volatile和synchronized的区别

voalite

volatile修饰的变量具有可见性,对变量的操作在内存中进行,对所有线程共享变量,并且局部阻止了指令重排的发生,限制编译器对修饰变量的相关读写操作和指令重排。

volatile和synchronized的区别

  1. volatile仅能使用在变量上,synchronized可以使用在变量和方法与类级别上;
  2. volatile仅能实现变量的可见性,不能保证原子性,synchronized可以保证变量的可见性和原子性;
  3. volatile不会造成线程阻塞,synchronized可能会造成线程阻塞(因为volatile只是将当前变量的值及时告知所有线程,而synchronized是锁定当前变量不让其它线程访问);
  4. volatile标记的变量不会被编译器优化(因为不能指令重排),synchronized标记的变量可以被编译器优化;
  5. volatile修饰变量适合于一写多读的并发场景,而多写场景一定会产生线程安全问题(因此使用volatile而不是synchronized的唯一安全情况是类中只有一个可变的域)。
  6. 因为所有的操作都需要同步给内存变量,所以volatile一定会使线程的执行速度变慢。

volatile与static
volatile:保证一致性,不保证唯一性,多个实例有多个volatile变量。
volatile:保证唯一性,不保证一致性,多个实例共享一个静态变量。

你可能感兴趣的:(JAVA)