什么是线程
线程就是cpu执行的最小单位,一个进程内可以有多个线程负责完成不同的工作,线程之间的运行互不干扰,一般执行耗时的操作,如:网络请求,文件读写,数据库读写的时候就会新增一个线程执行。
线程安全的问题
线程执行的机制
1.jpg
2.jpg
如图所示,每一个线程都有自己的线程工作内存负责存储变量,在内部进行读写操作。主内存中存在一个共享的变量可以给线程读写,线程首先从主内存中读取要操作的变量,复制一个副本在自己的工作内存中,在工作内存中进行操作后再把副本的值同步到主内存中。
线程的工作内存是私有的,所以其他线程无法访问。
线程安全的本质
3.jpg
线程对主内存的变量读写都是互相独立的操作,可能变量为1的时候,A线程和B线程都取了变量,此时在他们的工作内存中变量都为1,假设A和B线程都对变量进行+1操作,A线程先完成了操作把变量同步到了主内存中,此时主内存变量就为2了,它没等B线程也完成就继续了后面的操作,把主内存的变量加到了2,这时候B线程也完成了+1的操作,B工作内存的变量副本值为2,他就同步到了主内存中,A线程的操作就作废了,主内存的变量值也变得不准确,也称为脏数据。
解决线程安全的问题
Synchronized 关键字
4.png
synchronized(Object key){
//可能引发线程安全的代码块
}
synchronized表示当前线程,被key对象独占,key也成为同步锁。
为了达到同步的效果,key必须是同一个对象。
每个线程要执行同步代码块,jvm会随机给任一线程key,获得key的线程可以执行自己同步代码块的内容,其他线程会被阻塞直至该线程完成执行同步代码块的内容,jvm会重新随机给其他线程key。