JAVA线程锁的问题

原创
2015/12/09 23:24
阅读数 47

这几天一直在看多线程。其中最常见的就是 生产者消费者 的问题。代码如下:

1. 队列

//一个定长的队列
Queue<Integer> queue = new LinkedList<Integer>();

2. 生产者

	public void run() {
		while(true) {
                        //(1)
			synchronized(queue) {
				while(queue.size() == maxSize) {
					try {
						System.out.println("Queue is full, Producer thread waiting for, consumer to take something from queue");
						queue.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				int i = new Random().nextInt();
				queue.add(i);
				System.out.println("Producing value : " + i);
                                //(2)
				queue.notifyAll();
			}
		}
	}

3.消费者

	@Override
	public void run() {
		while(true) {
			synchronized(queue) {
				while(queue.isEmpty()) {
					System.out.println("Queue is empty, Consumer thread is waiting, for producer thread to put something in queue");
					try {
						queue.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				//消费
				System.out.println(Thread.currentThread().getName() + "value : " + queue.remove());
				queue.notifyAll();
			}
		}
	}

问题:

  1. 这个锁是 queue拿到了,还是 线程对象 拿到了?
  2. 当 **queue.wait()**是线程被阻塞,还是 queue被阻塞?
  3. 假如是 queue 被阻塞,为什么还可以 **queue.notifyAll()**还可以执行?
  4. 假如是生产者线程对象被阻塞,消费者线程对象调用notifyAll。它怎么知道唤醒的是生产者还是消费者
展开阅读全文
打赏
0
0 收藏
分享
加载中
DavorŠuke博主
唉。伤心啊
2015/12/13 01:41
回复
举报
更多评论
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部