JAVA生产者与消费者问题

import java.io.IOException;public class WaitAndNotify{\tpublic static void main(String args) throws IOException\t{\t\tPerson person = new Person();\t\tnew Thread(new Consumer("消费者一", person)).start();\t\tnew Thread(new Consumer("消费者二", person)).start();\t\tnew Thread(new Consumer("消费者三", person)).start();\t\tnew Thread(new Producer("生产者一", person)).start();\t\tnew Thread(new Producer("生产者一", person)).start();\t\tnew Thread(new Producer("生产者一", person)).start();\t}}class Producer implements Runnable{\tprivate Person person;\tprivate String producerName;\tpublic Producer(String producerName, Person person)\t{\t\tthis.producerName = producerName;\t\tthis.person = person;\t}\t@Override\tpublic void run()\t{\t\twhile (true)\t\t{\t\t\ttry\t\t\t{\t\t\t\tperson.produce();\t\t\t} catch (InterruptedException e)\t\t\t{\t\t\t\te.printStackTrace();\t\t\t}\t\t}\t}}class Consumer implements Runnable{\tprivate Person person;\tprivate String consumerName;\tpublic Consumer(String consumerName, Person person)\t{\t\tthis.consumerName = consumerName;\t\tthis.person = person;\t}\t@Override\tpublic void run()\t{\t\ttry\t\t{\t\t\tperson.consume();\t\t} catch (InterruptedException e)\t\t{\t\t\te.printStackTrace();\t\t}\t}}class Person{\tprivate int foodNum = 0;\tprivate Object synObj = new Object();\tprivate final int MAX_NUM = 5;\tpublic void produce() throws InterruptedException\t{\t\tsynchronized (synObj)\t\t{\t\t\tif (foodNum == 5)\t\t\t{\t\t\t\tSystem.out.println("box is full,size = " + foodNum);\t\t\t\tsynObj.wait();\t\t\t}\t\t\tfoodNum++;\t\t\tSystem.out.println("produce success foodNum = " + foodNum);\t\t\tsynObj.notifyAll();\t\t}\t}\tpublic void consume() throws InterruptedException\t{\t\tsynchronized (synObj)\t\t{\t\t\tif (foodNum == 0)\t\t\t{\t\t\t\tSystem.out.println("box is empty,size = " + foodNum);\t\t\t\tsynObj.wait();\t\t\t}\t\t\tfoodNum--;\t\t\tSystem.out.println("consume success foodNum = " + foodNum);\t\t\tsynObj.notifyAll();\t\t}\t}}这个程序是有并发问题的。。。。。---------------------------------分割线--------------------------------------------上面的程序是有并发错误的,执行下就会发现会出现foodNum一直无节制增长或者无节制减少for (int i = 0; i \u0026lt; 10; i++){ person.consume();} for (int i = 0; i \u0026lt; 10; i++){ person.produce();}改成这样会更明显的看到出现了负值一开始认为synchronized锁的问题,不过看了synchronized锁的一些性质就会发现,没有问题Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用.无论是加在方法上的synchronized还是synchronized(object)都是一样的作用


推荐阅读