Java里线程安全的有界容器的实现
作者:网络转载 发布时间:[ 2016/3/31 11:26:15 ] 推荐标签:测试开发技术 编程语言
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大小的空间,这样的话实现需要多考虑一个逻辑“当栈里没元素怎么办? 当栈的空间满了该怎么处理?”。

sales@spasvo.com