1. 引言
  这篇博客通过实现一个有界容器来表述Java里wait,notify,notifyAll的用法。这些关键词用的概率不高,但是阅读一些源码的时候还是经常会遇到,写一下增强记忆。
  具体生产实践的时候,对于我来说我是不推荐程序员们直接使用这些的,JAVA1.5之后提供很多直接可用的线程安全的容器,能少写代码少些代码,降低了测试的需求,
  也减少出错的可能性。
  2. 一个线程安全的容量有限的栈
  先把代码贴上:
package com.sabo.concurrent;
/**
* Created by canbin.zhang on 2016/3/29.
*/
public class SaboStack {
private final int[] _data;
public SaboStack(int limit) {
_data = new int[limit];
}
private final Object lock = new Object();
private int size = 0;
public void push(int v) {
synchronized (lock) {
while (size >= _data.length) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
_data[size] = v;
++size;
lock.notifyAll();
}
}
public int pop() {
int v;
synchronized (lock) {
while (size == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
v = _data[size - 1];
--size;
lock.notifyAll();
return v;
}
}
}
  要是stack的容量无限的话, 其实这里的实现只要synchronized关键词能实现了,但是大部分情况下内存的使用总是受到限制,比如栈多只能用10个int大小的空间,这样的话实现需要多考虑一个逻辑“当栈里没元素怎么办? 当栈的空间满了该怎么处理?”。