学习线程池时遇到了很多属性都用volatile修饰,因此去查了它的作用;
被volatile修饰的变量都有一个特征就是可见性得到保障,原子性得不到保障,是基于内存实现的;
举个例子:线程池的核心线程数corePoolSize是重要的初始化参数之一,当核心线程数发生变更时,线程池需要立刻知道,并触发一些方法。
被volatile修饰的变量corePoolSize读写时会强制使用内存,也就是说A线程对corePoolSize变量执行写操作时,会使其他线程刚从内存中读取的corePoolSize会被强制失效,需要其他线程重新从内存中再次获取;
优点:
保证了因缓存导致的数据不一致性;
确保了程序执行的先后顺序
缺点:
不具备原子性,修饰的变量的操作一般为读,改,写三者连续,当A线程写入时,主内存中的值如果已经改变,也是不会影响写的,例如变量原值为0 ,A读取后改成1 写入1之前,B线程已经改成了1,就会导致最后的结果还是1,而不是0+1+1=2
注意点:
修饰的变量的修改操作与自身无关
该变量没有包含在具有其他变量的不变式中