import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 演示：A 持有监视器时，C 仍能执行没有获取该监视器的字段写入。
 * Demo：在项目根目录执行 java reference/MonitorScopeDemo.java。
 * 验证：C 完成修改后，A 仍持有监视器，且 count 等于 2；超时或结果不符会报错。
 * 完成信号只用于安排演示顺序和观察结果，不是在推荐共享业务字段无锁读写。
 */
public final class MonitorScopeDemo {
    private static final Object MONITOR = new Object();
    private static int count;

    private MonitorScopeDemo() {}

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch writeCompleted = new CountDownLatch(1);
        Thread writer = new Thread(() -> {
            count = 2; // C 没有获取 MONITOR，仍然可以写入。
            writeCompleted.countDown(); // 通知 A：修改已经完成。
        }, "C");
        writer.setDaemon(true); // 若演示超时，后台线程不会阻止进程退出。

        synchronized (MONITOR) {
            count = 1;
            System.out.println("A：已持有监视器，count = 1");
            writer.start();
            // 等待完成信号不会释放这里持有的 MONITOR；最多等待 5 秒。
            if (!writeCompleted.await(5, TimeUnit.SECONDS)) {
                throw new IllegalStateException("C 未在 5 秒内完成写入，演示未通过");
            }
            if (!Thread.holdsLock(MONITOR) || count != 2) {
                throw new AssertionError("预期 A 仍持有监视器，且 C 已将 count 改为 2");
            }
            System.out.println("C：已完成未获取该监视器的修改");
            System.out.println("A：仍持有监视器 = " + Thread.holdsLock(MONITOR));
            System.out.println("A：此时 count = " + count);
        }
    }
}
