多线程不安全的底层原因以及两种加锁方式的区别
如何保证多线程的安全运行 1.线程的安全性问题体现在: 原子性:一个或者多个操作在 CPU 执行的过程中 不被中断 的特性 可见性:一个线程对共享变量的修改,另外一个线程能够 立刻看到 有序性:程序执行的顺序按照代码的 先后顺序 执行 2.导致原因: 缓存 导致的可见性问题 线程切换 带来的原子性问题 编译优化 带来的有序性问题 3.解决办法: JDK Atomic 开头的原子类、synchronized、Lock,可以解决原子性问题 synchronized、volatile、Lock,可以解决可见性问题 Happens-Before 规则可以解决有序性问题,JVM对程序运行设定的一些规则。 两种加锁方式的区别 1.这里的两种加锁方式分别指的是synchronized关键字和Lock类。 2.这两种方式的底层实现可以看: Lock底层原理 synchronized的底层实现 3.synchronized和Lock的区别: 实现层面不一样。synchronized 是 Java 关键字, JVM 层面 实现加锁和释放锁;Lock 是一个接口,在 代码层面 实现加锁和释放锁,( CAS乐观锁比synchronized更底层,是CPU原语,属于操作系统层面的 ) 是否自动释放锁。synchronized 在线程代码执行完或出现异常时 自动释放锁 ;Lock 不会自动释放锁,需要再