并发和并行:
并发是大时间段,并行是小时间段。
如果多个线程一起访问共享资源,至少一个线程进行修改操作,会出现线程安全问题。
JAVA内存模型知识:
当一个线程操作共享变量时,它首先从主内存复制共享变量到自己的工作内存中,然后在工作内存对变量进行修改,处理完后将变量的值更新到主内存中去。
例如这种CPU架构
双核CPU,每个核都有自己的控制器,运算器,Cache(一级缓存)
还有一个共享的二级缓存。
在线程修改数据,会先往cache中进行查找是否有相同的数据,如果有的话就直接用,两次都没有命中就写入内存,然后更新到缓存中去。
共享变量内存不可见问题:
线程A写数据到主内存,加载到缓存中。线程B修改缓存中的A修改过的值。并同步更新到缓存和内存中。当线程A再次修改值的时候,看不到线程B修改过的值。
Synchronized
原文:https://www.cnblogs.com/dwj-ngu/p/14608175.html