package safety.publishing;
public class PublicStaticPublishing {
public static void main(String[] args) {
new Thread(new ReadRunnable()).start();
new Thread(new WriteRunnable()).start();
}
}
class A {
public static int i = 0;
}
class ReadRunnable implements Runnable {
int cache = A.i;
@Override
public void run() {
for (;;) {
if (A.i != cache) {
System.out.println("cache miss " + A.i + " " + cache);
cache = A.i;
} else {
// System.out.println("cache hit");
}
}
}
}
class WriteRunnable implements Runnable {
@Override
public void run() {
for (int i =0; i<1000; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
A.i++;
}
}
}
字符串
有一个读取器线程和一个写入器线程。当ReadRunnable.run()方法的else块中的'println'语句被注解时,如上所示,由于我无法理解的原因,if块中的'println'语句也不会执行。控制台无限期保持空白。
但是,如果我在else块中取消注解'println',那么if和else块中的println语句都将打印如下所示。
cache hit
cache hit
cache hit
cache hit
cache hit
cache hit
cache hit
cache hit
cache hit
cache hit
cache miss 222 221
cache hit
型
我做错了什么?帮我弄明白到底发生了什么。
1条答案
按热度按时间goqiplq21#
在else块中取消注解
println
语句时,由于输出操作而引入延迟,在此期间,编写器线程(WriteRunnable
)有机会更新A.i
的值。因此,当在if语句中将cache
与A.i
进行比较时,根据写入器线程是否有机会更新A.i
,打印“高速缓存未命中”或“高速缓存命中”消息。然而,当你在else块中注解掉
println
时,并没有引入延迟,循环运行得非常快。在这种情况下,在执行if
语句时,A.i
的值可能还没有改变,导致else块被一致地执行,使控制台无限期地保持空白。