此时,Java中线程读写共享变量的模型与多核CPU类似,原因是Java并发程序运行在多核CPU上时,线程的私有内存,也就是工作内存就相当于多核CPU中每个CPU内核的缓存了。
由上图,同样可以看出,线程A对共享变量的修改,线程B不一定能够立刻看到,这也就会造成可见性的问题。
代码示例我们使用一个Java程序来验证多线程的可见性问题,在这个程序中,定义了一个long类型的成员变量count,有一个名称为addCount的方法,这个方法中对count的值进行加1操作。同时,在execute方法中,分别启动两个线程,每个线程调用addCount方法1000次,等待两个线程执行完毕后,返回count的值,代码如下所示。
package io.mykit.concurrent.lab01; /** * @author binghe * @version 1.0.0 * @description 测试可见性 */ public class ThreadTest { private long count = 0; private void addCount(){ count ++; } public long execute() throws InterruptedException { Thread threadA = new Thread(() -> { for(int i = 0; i < 1000; i++){ addCount(); } }); Thread threadB = new Thread(() -> { for(int i = 0; i < 1000; i++){ addCount(); } }); //启动线程 threadA.start(); threadB.start(); //等待线程执行完成 threadA.join(); threadB.join(); return count; } public static void main(String[] args) throws InterruptedException { ThreadTest threadTest = new ThreadTest(); long count = threadTest.execute(); System.out.println(count); } }