2
|
1 package treecms.memory;
|
|
2
|
9
|
3 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
|
2
|
4 import treecms.api.Tree;
|
11
|
5 import treecms.api.TreeNode;
|
2
|
6
|
7
|
7 /**
|
|
8 * オンメモリのTree実装です。
|
|
9 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。
|
|
10 * @author shoshi
|
|
11 */
|
|
12 final class OnMemoryTree implements Tree
|
2
|
13 {
|
9
|
14 private static final AtomicReferenceFieldUpdater<OnMemoryTree,OnMemoryNode> m_refUpdater = AtomicReferenceFieldUpdater.newUpdater(OnMemoryTree.class,OnMemoryNode.class,"m_root");
|
|
15 private volatile OnMemoryNode m_root;
|
2
|
16
|
7
|
17 /**
|
|
18 * コンストラクタです。
|
|
19 * @param _newRoot 木構造のルートノードです。
|
|
20 */
|
|
21 public OnMemoryTree(OnMemoryNode _newRoot)
|
2
|
22 {
|
9
|
23 m_root = _newRoot;
|
2
|
24 }
|
|
25
|
7
|
26 /**
|
|
27 * この木構造のルートNodeを取得します.
|
|
28 * @return ルートNode
|
|
29 */
|
|
30 @Override
|
11
|
31 public TreeNode getRoot()
|
7
|
32 {
|
11
|
33 return new OnMemoryTreeNode(m_root,null);
|
8
|
34 }
|
|
35
|
|
36 /**
|
7
|
37 * ルートNodeを比較して置き換えます.
|
|
38 * @param _except 比較する対象
|
|
39 * @param _newRoot 一致した場合置き換える対象
|
|
40 */
|
9
|
41 public boolean compareAndSwapRootNode(OnMemoryNode _expect,OnMemoryNode _newRoot,boolean _force)
|
7
|
42 {
|
|
43 if(_force){
|
9
|
44 m_root = _newRoot;
|
7
|
45 }
|
|
46
|
9
|
47 m_refUpdater.compareAndSet(this,_expect,_newRoot);
|
7
|
48 return true;
|
|
49 }
|
8
|
50
|
2
|
51 }
|