暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

synchronized关键字和volatile关键字的区别

吉林乌拉 2019-05-05
106

synchronized

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

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

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

volatile

  • volatile的性能比synchronized要高

  • volatile只能修饰变量

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

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


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


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





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




我们看结果上述的代码就是线程安全的了。这就是synchronized关键字和volatile关键字的区别。


文章转载自吉林乌拉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论