欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

静态变量无法完成多线程同步

程序员文章站 2022-03-23 23:21:51
...

静态变量无法完成多线程同步

描述

ABC顺序打印问题,代码如下,但是执行后发现未能按照预想循环执行,使用同步代码块,volatile,原子类型,System.out.print()语句都可以完成循环打印,思考良久后,醒悟:

工作内存保存数据后,没有触发条件的情况下,会一直使用工作内存数据,不会同步主内存数据。线程1一直以为flag是2,线程2一直以为flag是3,线程3一直以为flag是1。

public class ABCPrint {

    public static int flag = 1;

    /**
     * 1A
     * 2B
     * 3C
     */

    private void printA() {
        while (true) {
            if (flag == 1) {
                System.out.print("A" + flag);
                flag = 2;
                System.out.print("A" + flag);
            }
        }
    }

    private void printB() {
        while (true) {
            if (flag == 2) {
                System.out.print("B" + flag);
                flag = 3;
                System.out.print("B" + flag);
            }
        }
    }

    private void printC() {
        while (true) {
            if (flag == 3) {
                System.out.print("C" + flag);
                flag = 1;
                System.out.print("C" + flag);
            }
        }
    }

    private void printD() {
        while (true) {
            System.out.println("flag" + flag);
        }
    }

    public static void main(String[] args) {

        ABCPrint abcPrint = new ABCPrint();

        new Thread(() -> abcPrint.printA()).start();
        new Thread(() -> abcPrint.printB()).start();
        new Thread(() -> abcPrint.printC()).start();
        new Thread(() -> abcPrint.printD()).start();

    }
}