diff src/treecms/memory/OnMemoryTree.java @ 9:17ed97ca9960

commit
author shoshi
date Mon, 18 Apr 2011 01:07:27 +0900
parents f96193babac0
children 85061e874775
line wrap: on
line diff
--- a/src/treecms/memory/OnMemoryTree.java	Thu Mar 31 02:08:44 2011 +0900
+++ b/src/treecms/memory/OnMemoryTree.java	Mon Apr 18 01:07:27 2011 +0900
@@ -4,6 +4,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
 import treecms.api.Forest;
 import treecms.api.Node;
@@ -18,7 +19,8 @@
  */
 final class OnMemoryTree implements Tree
 {
-	private AtomicReference<OnMemoryNode> m_ref;
+	private static final AtomicReferenceFieldUpdater<OnMemoryTree,OnMemoryNode> m_refUpdater = AtomicReferenceFieldUpdater.newUpdater(OnMemoryTree.class,OnMemoryNode.class,"m_root");
+	private volatile OnMemoryNode m_root;
 	
 	/**
 	 * コンストラクタです。
@@ -26,7 +28,7 @@
 	 */
 	public OnMemoryTree(OnMemoryNode _newRoot)
 	{
-		m_ref = new AtomicReference<OnMemoryNode>(_newRoot);
+		m_root = _newRoot;
 	}
 	
 	/**
@@ -36,7 +38,7 @@
 	@Override
 	public Forest getForest()
 	{
-		return m_ref.get().getForest();
+		return m_root.getForest();
 	}
 
 	/**
@@ -46,7 +48,7 @@
 	@Override
 	public NodeID getID()
 	{
-		return m_ref.get().getID();
+		return m_root.getID();
 	}
 
 	/**
@@ -56,7 +58,7 @@
 	@Override
 	public NodeData getData()
 	{
-		return m_ref.get().getData();
+		return m_root.getData();
 	}
 
 	/**
@@ -66,7 +68,7 @@
 	@Override
 	public Node getRoot()
 	{
-		return m_ref.get();
+		return m_root;
 	}
 
 	/**
@@ -76,7 +78,7 @@
 	@Override
 	public void add(Node _child)
 	{
-		m_ref.get().add(_child);
+		m_root.add(_child);
 	}
 
 	/**
@@ -86,7 +88,7 @@
 	@Override
 	public void addAll(List<Node> _children)
 	{
-		m_ref.get().addAll(_children);
+		m_root.addAll(_children);
 	}
 
 	/**
@@ -96,7 +98,7 @@
 	@Override
 	public List<Node> children()
 	{
-		return m_ref.get().children();
+		return m_root.children();
 	}
 	
 	/**
@@ -107,7 +109,7 @@
 	@Override
 	public ByteBuffer get(ByteBuffer _key)
 	{
-		return m_ref.get().get(_key);
+		return m_root.get(_key);
 	}
 
 	/**
@@ -117,7 +119,7 @@
 	@Override
 	public Map<ByteBuffer,ByteBuffer> getAll()
 	{
-		return m_ref.get().getAll();
+		return m_root.getAll();
 	}
 
 	/**
@@ -128,7 +130,7 @@
 	@Override
 	public void put(ByteBuffer _key,ByteBuffer _value)
 	{
-		m_ref.get().put(_key,_value);
+		m_root.put(_key,_value);
 	}
 
 	/**
@@ -138,7 +140,7 @@
 	@Override
 	public void putAll(Map<ByteBuffer, ByteBuffer> _map)
 	{
-		m_ref.get().putAll(_map);
+		m_root.putAll(_map);
 	}
 	
 	/**
@@ -148,7 +150,7 @@
 	@Override
 	public void remove(ByteBuffer _key)
 	{
-		m_ref.get().remove(_key);
+		m_root.remove(_key);
 	}
 	
 	/**
@@ -158,7 +160,7 @@
 	@Override
 	public void remove(Node _child)
 	{
-		m_ref.get().remove(_child);
+		m_root.remove(_child);
 	}
 	
 	/**
@@ -166,13 +168,13 @@
 	 * @param _except 比較する対象 
 	 * @param _newRoot 一致した場合置き換える対象
 	 */
-	public boolean compareAndSwapRootNode(OnMemoryNode _except,OnMemoryNode _newRoot,boolean _force)
+	public boolean compareAndSwapRootNode(OnMemoryNode _expect,OnMemoryNode _newRoot,boolean _force)
 	{
 		if(_force){
-			return m_ref.compareAndSet(_except,_newRoot);
+			m_root = _newRoot;
 		}
 		
-		m_ref.set(_newRoot);
+		m_refUpdater.compareAndSet(this,_expect,_newRoot);
 		return true;
 	}