如何保证多线程的安全运行
1.线程的安全性问题体现在:
- 原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性
- 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
- 有序性:程序执行的顺序按照代码的先后顺序执行
2.导致原因:
- 缓存导致的可见性问题
- 线程切换带来的原子性问题
- 编译优化带来的有序性问题
3.解决办法:
- JDK Atomic 开头的原子类、synchronized、Lock,可以解决原子性问题
- synchronized、volatile、Lock,可以解决可见性问题
- Happens-Before 规则可以解决有序性问题,JVM对程序运行设定的一些规则。
两种加锁方式的区别
1.这里的两种加锁方式分别指的是synchronized关键字和Lock类。
2.这两种方式的底层实现可以看: