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大小的空间,这样的话实现就需要多考虑一个逻辑“当栈里没元素怎么办? 当栈的空间满了该怎么处理?”。