9.9. 关键字 volatile 与 synchronized 作用与区别

发布于 2023-05-06 12:40:10 字数 842 浏览 39 评论 0

volatile

它所修饰的变量不保留拷贝,直接访问主内存中的。

在Java内存模型中,有 main memory,每个线程也有自己的 memory (例如寄存器)。为了性能,一个线程会在自己的 memory 中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间,在一个线程的 memory 中的值可能与另外一个线程 memory 中的值,或者 main memory 中的值不一致的情况。 一个变量声明为 volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它 cache 在线程 memory 中。

synchronized

当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

  • 当两个并发线程访问同一个对象 object 中的这个 synchronized(this) 同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
  • 然而,当一个线程访问 object 的一个 synchronized(this) 同步代码块时,另一个线程仍然可以访问该 object 中的非 synchronized(this) 同步代码块。
  • 尤其关键的是,当一个线程访问 object 的一个 synchronized(this) 同步代码块时,其他线程对 object 中所有其它 synchronized(this) 同步代码块的访问将被阻塞。
  • 当一个线程访问 object 的一个 synchronized(this) 同步代码块时,它就获得了这个 object 的对象锁。结果,其它线程对该 object 对象所有同步代码部分的访问都被暂时阻塞。
  • 以上规则对其它对象锁同样适用.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

灯下孤影

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

懂王

文章 0 评论 0

清秋悲枫

文章 0 评论 0

niceone-tech

文章 0 评论 0

小伙你站住

文章 0 评论 0

刘涛

文章 0 评论 0

南街九尾狐

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文