通过Demo
演示出Java
中并发问题。
可以观察到的现象 比 说说的并发原则 更直观更可信。
Demo
类com.oldratlee.fucking.concurrency.NoPublishDemo
。
主线程中设置属性stop
为true
,以控制main
启动的任务线程退出。
在主线程属性stop
为true
后,但任务线程持续运行,任务线程中读不到新值。
mvn compile exec:java -Dexec.mainClass=com.oldratlee.fucking.concurrency.NoPublishDemo
long
变量读写不是原子的,会分为2次4字节操作。
Demo
类com.oldratlee.fucking.concurrency.InvalidLongDemo
。
主线程修改long
变量,每次写的值的高4字节和低4字节是一样的。在任务线程中读取long
变量。
任务线程中读到了高4字节和低4字节不一样的long
变量,即是无效值(从来没有设置过的值)。
mvn compile exec:java -Dexec.mainClass=com.oldratlee.fucking.concurrency.InvalidLongDemo