Java里线程安全的有界容器的实现

发表于:2016-3-31 09:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:canbin.zhang    来源:51Testing软件测试网采编

  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大小的空间,这样的话实现就需要多考虑一个逻辑“当栈里没元素怎么办? 当栈的空间满了该怎么处理?”。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号