静态变量无法完成多线程同步
程序员文章站
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();
}
}
下一篇: 静态变量(static)的线程安全