JUC
volatile 关键字和内存可见性: 内存可见性(Memory Visibility)是指当①某个线程正在使用对象状态,而②另一个线程在同时修改该状态,需要③确保当一个线程修改了对象 状态后,④其他线程能够看到发生的状态变化。----- 在程序运行的时候,jvm会为每个线程分配一块独立的缓存,其中有一块主存(存放着共享资源),线程一用于修改共享数据,main线程用于读共享数据, 当线程一要对主存中共享数据的值进行改变的时候,先把共享数据读到缓存中来,然后在修改值,修改完后,将修改好后的值写会到主存中去, 在将修改后的值写入主存中前,此时main线程从主存中的数据读取出来,按理来说是先线程一执行修改数据,在main线程读取修改后的数据, 由于在线程一共享数据写入主存之前就执行main线程中读取共享数据,所以导致main线程缓存中的值是修改前的值(按代码逻辑来说是修改后的), 此时main线程缓存中存放的值是修改前的值,当调用了比较底层的代码(例如while(true)),执行效率非常高,高到main线程没有机会再次去主存中 读取一次数据(就是线程一修改后的,即逻辑正确情况)。 内存可见性问题是,当多个线程操作共享数据时,彼此不可见(由于首先读取线程的数据(共享数据)是不符合代码逻辑的,再加上某个底层代码执行效率太高,读取线程无法再次去主存中获取最新数据)