jmm - java如何把数据同步到主内存?
ringa_lee
ringa_lee 2017-04-17 13:27:50
0
2
481

Consumer.run()里面执行n.conusme()时,count值为5
但是之后的n.getCount()得到的是4

public class ThreadDemo { public static void main(String[] args) { Apple n = new Apple(); Thread a1 = new Thread(new Producer(n), "Producer"); Thread a2 = new Thread(new Consumer(n), "Consumer"); a1.start(); try{ Thread.sleep(1000) ; }catch(InterruptedException e){ e.printStackTrace() ; } a2.start(); } } class Producer implements Runnable { Apple n; public Producer(Apple n) { this.n = n; } volatile boolean keepRunning = true; @Override public void run() { while (true) { while (keepRunning) { if (n.getCount() < 5) { n.produce(); System.out.println(Thread.currentThread().getName() + " produced an apple," + n.getCount() + " apple(s) left"); } if (n.getCount() >= 5) { keepRunning = false; } Thread.yield(); } if (n.getCount() < 5) { keepRunning = true; } } } } class Consumer implements Runnable { Apple n; public Consumer(Apple n) { this.n = n; } volatile boolean keepRunning = true; @Override public void run() { while (true) { while (keepRunning) { if (n.getCount() <= 5 && n.getCount() > 0) { n.consume(); System.out.println(Thread.currentThread().getName() + " consumed an apple," + n.getCount() + " apple(s) left");////here is 5 } if (n.getCount() <= 0) { keepRunning = false; } Thread.yield(); } if (n.getCount() > 0) { keepRunning = true; } } } } class Apple { private int count = 0; public int getCount() { return count; } public synchronized void produce() { count++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void consume() { count--; System.out.println("count="+count);//here is 4 } }
ringa_lee
ringa_lee

ringa_lee

全部回覆 (2)
Ty80

因为getcount方法没有使用sychronized,所以当你调用consumer方法时,getcount方法也会同时执行

    伊谢尔伦

    加锁 或是 使用volatile 会保证多线程间数据的修改是可见的。

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!