如何开淘宝店做国外网站,网站备案审核流程,wordpress接入微信,上海网站注销EvenGenerator 是一个偶数生成器#xff0c;每调用一个 next() 就会加 2 并返回叠加后结果。在本案例中#xff0c;充当被共享的资源。EvenChecker 实现了 Runnable 接口#xff0c;可以启动新的线程执行 run() 任务#xff0c;用于检测所指向的偶数生成器是否每次都返回偶…EvenGenerator 是一个偶数生成器每调用一个 next() 就会加 2 并返回叠加后结果。在本案例中充当被共享的资源。EvenChecker 实现了 Runnable 接口可以启动新的线程执行 run() 任务用于检测所指向的偶数生成器是否每次都返回偶数值。EvenCheckerThreadDemo 用于演示多线程下的执行情况。非线性安全版本EvenGenerator, 偶数生成器每调用一个 next() 就会加 2 并返回叠加后结果。这里的 next() 方法并非线性安全在多线程同时访问时可能会返回奇数。一个线程执行了第一个累加语句后被调度器中断替换上下文另一个进程开始执行 next() 方法则会返回奇数。public classEvenGenerator {private int count 0;public intnext(){count;count;returncount;}}EvenChecker 检测指向的 EvenGenerator 是不是每次都返回偶数。public class EvenChecker implementsRunnable {privateEvenGenerator eg;private final int id count;private static int count 0;Overridepublic voidrun() {while (true){int res eg.next();if (res % 2 ! 0){System.out.println(not even res | Thread # id);break;}}}publicEvenChecker(EvenGenerator eg){this.eg eg;}}演示多线程下的执行情况多个线程同时执行 EvenChecker 但是引用的是同一个 EvenGeneratorimportjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classEvenCheckerThreadDemo {public static voidmain(){ExecutorService execExecutors.newCachedThreadPool();EvenGenerator eg newEvenGenerator();for (int i 0; i 5 ; i){exec.execute(newEvenChecker(eg));}}}线性安全版本1使用 synchronized 关键词使得 next() 方法线程安全确保同一时间内最多只有一个线程进入该方法。public classEvenGenerator {private int count 0;public synchronized intnext(){count;count;returncount;}}线性安全版本2使用 Lock 把访问、修改共享变量的语句进行同步确保同一时间内最多只有一个线程进入该块代码。使用 try-finally 结构可以确保 Lock 一定被释放。importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classEvenGenerator {private int count 0;private Lock lock newReentrantLock();public intnext(){lock.lock();try{count;count;returncount;}finally{lock.unlock();}}}参考资料Page 827, Resolving shared resource contention, Thinking in Java