synchronized和volatile的作用和区别

valatile

被volatile修饰的共享变量保证不同线程对于此变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对于其他线程来说是立即可见的,并且将会禁止进行指令重排序。
其本质是告诉jvm当前变量在寄存器中的值是不确定的,需从主内存中读取。

synchronized

当它使用在变量上时,将会锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞。

synchronized和volatile的区别

1.volatile仅能使用在变量级别,synchronized则可以使用在变量、方法、类级别上。
2.volatile仅仅能实现变量修改可见性,并不能保证原子性,synchronized可以实现变量的修改可见性和原子性。
3.volatile不会造成线程阻塞,synchronized可能会造成线程阻塞。
4.volatile标记的变量不会被编译器优化,synchronized标记的变量可以被编译器优化。

你可能感兴趣的:(Java)