本文最后更新于48 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
为了解决线程不安全问题,可以通过JMM(JAVA内存模型)解决,JMM提供了多个方法来解决原子性、可见性、顺序性的问题
- 可见性:
- volatile关键字可以保证可见性(一个线程对共享数据的修改可以立刻被其他线程看到)
- synchronized关键字、lock方法:可以保证同一时刻只有一个线程获取锁执行同步代码,并且在锁释放前将变量的修改更新到主存,保证可见性
- 原子性:
- JAVA能保证对单个操作的原子性,但不能保证多个操作的原子性
- 想要实现更大范围的原子性,可以通过synchronized和lock实现
- 有序性:
- volatile关键字可以保证一定范围的有序性
- 可以通过synchronized和lock保证有序性
- JMM是通过Happens-Before规则保证有序性的
此外,对于一些线程独有而不需要被共享的变量,还能通过使用ThreadLocal让每个线程都有自己独立的变量,从而避免共享,从而保证线程安全。
学习JMM JMM
学习Synchronized Synchronized
学习Volatile Volatile
学习Final Final