开发原因

ArrayList太重,线程还不安全
在一些队列处理的时候,ArrayList有点麻烦,还比较占内存,还没缓存,又得再加个缓存队列
所以就开发了这个
轻量级,线程安全,带缓存!nice!!

源码

package com.geom.queue;public class SinglyLinked<T>{private Object _lock = new Object();private int _length = 0;private SinglyLinkedNode<T> _head = new SinglyLinkedNode<T>();private SinglyLinkedNode<T> _end = null;private int _cacheMax = 0;private SinglyLinked<Object> _cache = null;public SinglyLinked(){}/** * 0表示不缓存SinglyLinkedNode * @param cacheMax */public SinglyLinked(int cacheMax){_cacheMax = cacheMax;if(_cacheMax > 0){_cache = new SinglyLinked<Object>();}}public int length(){return _length;}@SuppressWarnings("unchecked")public void push( T value ){SinglyLinkedNode<T> node = null;if( _cache != null ){Object obj = _cache.pop();if( obj != null ) node = (SinglyLinkedNode<T>)obj;}if( node==null ) node = new SinglyLinkedNode<T>();node.value = value;node.next = null;synchronized (_lock){if(_end==null)_head.next = node;else _end.next = node;_end = node;_length++;}}public T pop(){synchronized (_lock){if( _head.next != null ){T v = _head.next.value;if( _head.next==_end ){_end = null; //防止尾巴自己成一个链表}if( _cache != null ){if( _cache._length < _cacheMax ){_head.next.value = null;_cache.push(_head.next);}}_head.next = _head.next.next;_length--;return v;}}return null;}private SinglyLinkedNode<T> _current = null;public void resetFor(){synchronized (_lock){_current = _head.next;}}/** * 跟resetFor一起使用 * @return */public T next(){synchronized (_lock){if( _current != null ){T v = _current.value;_current = _current.next;return v;}}return null;}private static class SinglyLinkedNode<T>{SinglyLinkedNode<T> next = null;public T value = null;public SinglyLinkedNode(){}}}

测试代码

public static void main(String[] args){SinglyLinked<Integer> link = new SinglyLinked<Integer>(10);link.push(1);link.push(2);link.resetFor();Integer v;while( (v = link.next()) != null ){System.out.println(v);}new Thread(new Runnable(){private int _v = 0;@Overridepublic void run(){while(true){link.push(_v++);try{Thread.sleep(1);} catch (InterruptedException e){e.printStackTrace();}}}}).start();new Thread(new Runnable(){@Overridepublic void run(){while(true){System.out.println(link.length() + ": " + link.pop());try{Thread.sleep(1);} catch (InterruptedException e){e.printStackTrace();}}}}).start();}