java如何把数据同步到主内存?

发布于 2022-09-01 06:10:37 字数 2532 浏览 20 评论 0

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
    }

}


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

惟欲睡 2022-09-08 06:10:37

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

ˇ宁静的妩媚 2022-09-08 06:10:37

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文