繁体   English   中英

Java 并发实践“清单 7.1。使用 volatile 字段来保持取消状态。”。 同步可见性?

[英]Java Concurrency in Practice "Listing 7.1. Using a volatile field to hold cancellation state.". synchronized for visibility?

我正在阅读 Java Concurrency in Practice 并遇到以下代码片段。 我认为synchronized的用法是为了可见性(让调用generator.get()的线程看到最新的primes ),因为PrimeGenerator任务是由一个线程执行的,内部primes不与其他线程共享。

我对吗?

清单 7.1。 使用 volatile 字段来保持取消状态。

@ThreadSafe
public class PrimeGenerator implements Runnable {
    @GuardedBy("this")
    private final List<BigInteger> primes
            = new ArrayList<BigInteger>();
    private volatile boolean cancelled;

    public void run() {
        BigInteger p = BigInteger.ONE;
        while (!cancelled) {
            p = p.nextProbablePrime();
            synchronized (this) {
                primes.add(p);
            }
        }
    }

    public void cancel() {
        cancelled = true;
    }

    public synchronized List<BigInteger> get() {
        return new ArrayList<BigInteger>(primes);
    }
}

清单 7.2。 生成一秒钟的质数。

List<BigInteger> aSecondOfPrimes() throws InterruptedException {
    PrimeGenerator generator = new PrimeGenerator();
    new Thread(generator).start();
    try {
        SECONDS.sleep(1);
    } finally {
        generator.cancel();
    }
    return generator.get();
}

我认为使用synchronized有两个目的。

  1. 能见度 通过添加线程,让阅读线程看到最新的质primes变化。
  2. 原子性 当读取线程正在读取时,添加线程被阻塞,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM