java吧 关注:1,227,313贴子:12,685,434
  • 6回复贴,共1

【疑问】如何把数据同步到主内存????

只看楼主收藏回复

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
}
}
~~~......!!!!!


来自Android客户端1楼2015-04-19 09:26回复
    没人吗..?


    来自Android客户端2楼2015-04-19 23:21
    回复
      同步到主存...这已经上升到cpu寄存器的高度了么
      你那里都--了怎么可能会有5.。。


      3楼2015-04-19 23:39
      回复
        执行完n.conusme()
        n的值就已经减一了
        这时候n.getCount()的值就变成4 没问题啊


        IP属地:四川4楼2015-04-19 23:48
        回复
          楼主的这个生产者 消费者 写的好奇怪;
          首先只有一个生产线程和 一个消费线程,怎么算是多线程程序呢?

          在这个代码里添加一个消费者线程,
          输出就变成线程不安全了;

          在这段代码里,明显使用了先检查后执行的错误。
          肯定是线程不安全的,尽管n.consume()方法是线程安全的。


          IP属地:四川5楼2015-04-20 00:03
          收起回复
            建议楼主把 if then这样的代码放到consume和produce这两个线程安全的方法里进行判断…还有就是最好使用wait和notify来进行线程间的通信或者用lock的condition判断…。使用semaphore信号量来做就更简单了…


            IP属地:四川来自iPhone客户端6楼2015-04-20 00:17
            回复