1.java内存模型
- jmm决定一个线程对共享变量的写入时,能够对另一个线程是否可见。
- 主内存:共享内存变量
- 本地内存:共享变量的副本
我们在做这多线程的时候,其实每个线程都有自己的线程的内存,就是我们说的本地内存,多线程每次在做处理的时候会把主内存中的变量放到本地内存中去处理,处理完了之后会把他再次的刷到主内存中。如果我们不做同步的话,就可能多个线程操作同一个变量比如说都操作count++两边开始刷到自己内存的时候都是0都做了++操作了按道理应该是2了但是最后发现还是1——不保证可见性
2. volatile关键子(只保证可见性不保证原子性-就是不保证线程安全)
- 可见性:也就是说一旦某个线程修改了被volatile修饰的变量。它会保证修改的值会立即被更新到主存。当又其他线程需要读取时,可以立即获取修改之后的值。
- 在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。
- 项目中,什么时候使用volatile,只要是全局共享变量,全部都是加上volatile关键字。
线程可见性的例子
class ThreadVolatileDemo extends Threa