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

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

reply all(2)
Ty80

Because the getcount method does not use sychronized, when you call the consumer method, the getcount method will also be executed at the same time

伊谢尔伦

Lock or use volatile will ensure that data modifications between multiple threads are visible.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!