并发安全问题总结

12 篇文章 0 订阅
什么是线程安全?

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

保证线程安全的几个基本特性?
  • 原子性,简单说就是相关操作不会中途被其他线程干扰,一般通过同步机制实现。
  • 可见性,是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,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
ReenTrantLock是如何实现同步的?
使用Synchronized和ReentrantLock同步加锁的区别?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值