什么是线程安全
多线程执行某段代码,不对这段代码进行同步处理、线程间的协调,程序运行的结果仍与预期一致,这就是线程安全。
多线程编程的三个核心概念
原子性
: 同数据库事务的原子性,一些操作要么全部成功,要么全部失败,经典的例子就是银行转账。可见性
:多线程并发访问共享变量时,某个线程对共享变量的更新,其他线程能立即看到这个更新。
在java中,对象储存在主内存。每个线程都有自己的工作内存,线程从主内存读取对象到工作内存,执行更新对象操作,立即更新工作内存,但没有立即刷新到主内存,故其他线程仍然读到旧值。
顺序性
: 指程序顺序执行代码中的操作。
编译器、处理器会进行指令重排序,优化代码,以提高处理速度。程序实际的执行顺序可能与代码中的不一样,但编译器、处理器保证结果是一样的。这不会影响单线程的正确性,但会影响多线程的正确性。
要保证多线程程序正确执行,必需保证原子性、可见性、顺序性。
synchronized、ReentrantLock
使用synchronized、ReentrantLock作用于一段代码,同一时刻只能有一个线程能进入这段代码,保证了原子性、顺序性。使用synchronized、ReentrantLock获取到锁,线程更新共享变量后会立即刷新到主内存,其他线程获取到同一