java多线程之线程安全的原因

学习java多线程的时候,经常碰到以 i++为例的说明多线程是不安全的,说i++分三步操作完成的,如果执行到中间步骤,其余的线程也同时操作了该变量,就会出现线程不安全的问题;但是要理解这个问题,其实是需要一些计算机方面的理论作为铺垫的,否则无法真正理解这个解释;下面我们来说明下,这些前置知识;

工作内存和主内存?

工作内存:每个多线程都有自己的工作内存;是线程私有的;

主内存:是所有线程共享的内存;

计算机的cpu在运算的时候,并不总是从内存读取数据,他的数据读取顺序是:寄存器>高速缓存>内存(寄存器和高速缓存就是工作内存);线程耗费的是CPU,线程运算的原始数据来自于主内存,但在运算的过程中,有些数据需要频繁的别读取,这些数据被存储在寄存器中和高速缓存中,当线程运算完成后,这些缓存的数据在适当的时候在写会到主内存中;因此,只要有多于一个的线程访问同一个变量,而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问;JVM是一个虚拟的计算机,也面临多线程并发的问题,java程序运行在java虚拟机平台上,java程序员不可能会直接去操作控制底层线程对寄存器,高速缓存和主内存之间的同步问题;因此java从语法层面给程序员提供了一写解决方案,即volatile(可见性)、synchronize(独占锁),锁机制等等;

volatile是通过要求对变量的每一次修改都需要同步到主内存来保证线程安全性;

synchronize是通过独占锁,synchronize修饰的代码只有获得锁的线程才可以执行,其余想要执行该代码,都需要等到获得锁的线程释放锁之后,才可以获得,当然,可能有多个线程都在等待,下一个是哪个线程获得锁也是不定的,所以synchronize使用时,粒度应该尽量小,以减少获取锁的时长;

猜你喜欢

转载自blog.csdn.net/qq516071744/article/details/86558233