本帖最后由 杨兴庭 于 2013-7-18 21:26 编辑
- package com.zhangyg.thread.mytest;
- public class ThreadCommunication {
- public static void main(String[] args) {
- Warehouse w = new Warehouse();
- Proudcer p = new Proudcer(w);
- Consumer c = new Consumer(w);
- p.start();
- c.start();
- }
- }
- class Proudcer extends Thread {
- Warehouse w;
-
- Proudcer(Warehouse w) {
- this.w = w;
- }
- @Override
- public void run() {
- for (int i = 1; i <= 10; i++) {
- // 生产商品
- w.put(i);
- //该语句引起问题
- System.out.println("Producer 生产 " + i);
- }
- }
- }
-
- class Consumer extends Thread {
- Warehouse w;
-
- Consumer(Warehouse w) {
- this.w = w;
- }
-
- @Override
- public void run() {
- while (true) {
- //该语句引起问题
- System.out.println("Customer "+" 消费 "+ w.get());
- }
- }
- }
- class Warehouse {
- private int value;
- boolean bFull = false; //仓库是否有商品
- // 生产商品
- public void put(int value) {
- if (!this.bFull) { // 仓库中没有商品
- this.value = value;
- this.bFull = true;
- this.notify(); // 通知消费者进行消费
- }
- try {
- this.wait(); // 等待消费者消费商品
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- // 消费商品
- public int get() {
- if (!this.bFull) { //仓库中没有商品
- try {
- this.wait(); //等待生产者生产商品
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- this.bFull = false;
- this.notify(); //通知生产者生产商品
- return this.value;
-
复制代码 请问上面的put和get方法为什么要枷锁,synchronized加在一个方法上,代表这个方法只能一个选择去运行吗,我感觉这边put只有生存者去调用,而get也只有消费者去调用,没有别的方法竞争啊,为什么要加synchronized,谢谢大神帮忙。 |