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)都是一样的作用
推荐阅读
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 雪乡烤肠卖15元一根引热议,媒体:定价要以消费者评价为准绳
- 唯品会无搜索模式真的能让大众消费者驻留页面更长时间吗
- 一场家具展,怎样让进去逛的消费者第一眼落在你的产品上
- 本田凌派|丰田三缸机终于来了!消费者会买账吗?
- 趣头条|将消费者放首位,威马起火主动召回态度引好评
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 车市速递|中期改款长和高有变化,新款指南者能否俘获更多消费者的心?
- 蛋糕|网购小蛋糕发霉 消费者索赔千元
- 黑五|
