01 synchronized和volatial关键字理解

vvEcho 2024-01-20 14:08:36
Categories: Tags:

synchronized 关键字可以用来修饰的方法,类,代码块会被加锁,他能保证线程的互斥性;所谓互斥性就是线程1加了锁后,线程2就会被阻塞直到线程1释放锁;
synchronized 能够及时的刷新内存,保证了内存的可见性和原子性。 具体工作过程如下:

在JMM中,每个线程都有自己独立的工作内存,即一组寄存器/cache高速缓冲区;在CPU和内存交互的时候,会先把内存中内容拷贝到工作内存,操作完之后在写回内存,这个过程非常容易出现数据不一致的情况,在编译器开启优化时特别严重
volatile 关键字用来修饰共享变量,保证共享变量的可见性,底层是在共享变量的两边增加内存屏障,禁止了指令重排;

volatile 为啥能保证内存可见性

volatile 的底层依赖 CPU 的缓存一致性协议(MESI)。
CPU 读取数据是按 cache line 读取的,当一个线程修改 volatile 变量时,会触发 cache line 的写入,并通过总线广播 invalidation,使其他 CPU 的缓存行失效。其他 CPU 在再次读取该变量时必须从内存重新加载,因此保证了变量的可见性