首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发安全问题总结

并发安全问题总结

作者头像
袁新栋-jeff.yuan
发布2020-08-26 17:59:09
5460
发布2020-08-26 17:59:09
举报
什么是线程安全?

答:当并发的时候不会出现竞台条件,多个线程访问更改同一个资源的时候,这个数据不会出现意料之外的情况。

保证线程安全的几个基本特性?
  • 原子性,简单说就是相关操作不会中途被其他线程干扰,一般通过同步机制实现。
  • 可见性,是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,volatile 就是负责保证可见性的。
  • 有序性,是保证线程内串行语义,避免指令重排等。
代码层面的线程安全是如何体现的?
  • 封装:通过封装,我们可以将对象内部状态隐藏、保护起来。
  • 不可变:还记得我们在专栏第 3 讲强调的 final 和 immutable 吗,就是这个道理,Java 语言目前还没有真正意义上的原生不可变,但是未来也许会引入。
  • 加锁同步,让所有的线程同步执行
怎么实现线程调用的同步?
  • 使用SnychronNized
  • 使用ReentrantLock
  • 在另一个层面的实现同步 :https://www.jianshu.com/p/bcddb6400ccb
Synchronized如何实现同步呢?
  • Syschronized实现同步有两种方式
  1. 通过将代码块放入Sychronized关键字中,底层实现方式是:在JVM中使用monitorenter和monitorexit指令实现a
  2. 通过将某个方法对象放入Synchronized。
  • 两种方式的具体实现?
  1. JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处, JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个 monitor 与之关联,当且一个monitor 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁
  2. sychronized加锁过程:
image
image
ReenTrantLock是如何实现同步的?
使用Synchronized和ReentrantLock同步加锁的区别?
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是线程安全?
  • 保证线程安全的几个基本特性?
  • 代码层面的线程安全是如何体现的?
  • 怎么实现线程调用的同步?
  • Synchronized如何实现同步呢?
  • ReenTrantLock是如何实现同步的?
  • 使用Synchronized和ReentrantLock同步加锁的区别?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档