java 无法理解线程行为

dfuffjeb  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(74)
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


我做错了什么?帮我弄明白到底发生了什么。

goqiplq2

goqiplq21#

在else块中取消注解println语句时,由于输出操作而引入延迟,在此期间,编写器线程(WriteRunnable)有机会更新A.i的值。因此,当在if语句中将cacheA.i进行比较时,根据写入器线程是否有机会更新A.i,打印“高速缓存未命中”或“高速缓存命中”消息。
然而,当你在else块中注解掉println时,并没有引入延迟,循环运行得非常快。在这种情况下,在执行if语句时,A.i的值可能还没有改变,导致else块被一致地执行,使控制台无限期地保持空白。

相关问题