synchronized和volatile关键字的区别是什么

synchronized和volatile关键字的区别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

synchronized

  • synchronized可以修饰方法和代码块

  • 多线程在执行synchronized方法时线程会阻塞

  • synchronized可以保证线程的原子性

volatile

  • volatile的性能比synchronized要高

  • volatile只能修饰变量

  • 多线程访问volatile时线程不会阻塞

  • volatile不能保证线程的原子性

线程原子性是指不能在被拆分的操作。在说的直白点就是我们知道线程在执行时是需要一个前提条件的那就是需要获取到系统CPU的执行资格,虽然线程获取到了执行资格但CPU也可以随时切换,不管线程是否执行完毕。线程原子性就是说如果线程已经获取到了CPU的执行资格,如果线程在没有执行完时,任何线程是不能够中断的。

下面的事例我们演示一下volatile关键字为什么不支持线程原子性。

synchronized和volatile关键字的区别是什么

synchronized和volatile关键字的区别是什么

synchronized和volatile关键字的区别是什么

我们看结果显示Thread-58和线程Thread-63输出count都是10000。这显然是不正确的。原因就是volatile关键字是不支持原子性也不支持同步性的。如果我们把count()方法添加synchronized关键字,那输出结果就是线程安全的了。

synchronized和volatile关键字的区别是什么

synchronized和volatile关键字的区别是什么

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对亿速云的支持。