volatile和synchronized区别

首先,它们都是同步原语

特性方面:volatile虽然具有可见性但是并不能保证原子性,其还可以通过内存屏障保证不让指令重排序。

性能方面:synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率(因为加锁会阻塞线程),而volatile关键字在某些情况下性能要优于synchronized(因为volatile不加锁)。

synchronized是不能保证指令不重排序的,但因为锁的原因可以保证原子性和可见性!
举个例子:
比如i++这种非原子操作,使用volatile修饰int型变量i,多个线程同时进行i++操作。比如有两个线程A和B对volatile修饰的i进行i++操作,i的初始值是0,A线程执行i++时刚读取了i的值0,就切换到B线程了,B线程(从内存中)读取i的值也为0,然后就切换到A线程继续执行i++操作,完成后i就为1了,接着切换到B线程,因为之前已经读取过了,所以继续执行i++操作,最后的结果i就为1了。同理可以解释为什么每次运行结果都是小于10000的数字。

你可能感兴趣的:(java,多线程)