并发安全问题总结

  • Post author:
  • Post category:其他




什么是线程安全?

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



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



版权声明:本文为weixin_40413961原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。