annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.java @ 132:ba5370090393

index commit Prototype
author one
date Sun, 19 Oct 2014 09:15:38 +0900
parents 715a9fbf02fc
children ef183969bf31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
2
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
3 import java.util.concurrent.atomic.AtomicBoolean;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
4 import java.util.concurrent.atomic.AtomicReference;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
5
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
6 public class AtomicReservableReference<V>
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
7 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
8 public static void main(String _args[])
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
9 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
10 String hoge = "hoge";
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
11 String fuga = "fuga";
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
12 AtomicReservableReference<String> arr = new AtomicReservableReference<String>(hoge);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
13 AtomicReservableReference<String>.Reservation r1 = arr.makeReservation(hoge,fuga);
81
715a9fbf02fc remove <T> many source
one
parents: 45
diff changeset
14 //AtomicReservableReference<String>.Reservation r2 = arr.makeReservation(hoge,fuga);
45
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
15
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
16 System.out.println(arr.get());
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
17 r1.confirm();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
18 System.out.println(arr.get());
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
19 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
20
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
21 private AtomicReference<Reservation> reservation;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
22 private AtomicBoolean flagReservation;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
23
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
24 public AtomicReservableReference(V _ref)
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
25 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
26 reservation = new AtomicReference<Reservation>(new Reservation(_ref,null,true));
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
27 flagReservation = new AtomicBoolean(false);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
28 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
29
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
30 public Reservation makeReservation(V _expect,V _update)
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
31 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
32 if(flagReservation.compareAndSet(false,true)){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
33 V value = get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
34 if(value == _expect){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
35 Reservation expect = reservation.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
36 return new Reservation(_update,expect,false);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
37 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
38 flagReservation.set(false);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
39 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
40
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
41 return null;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
42 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
43
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
44 public void set(V _value)
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
45 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
46 reservation.set(new Reservation(_value,null,true));
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
47 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
48
132
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
49 public Reservation getReservation(){
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
50 return reservation.get();
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
51 }
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
52
45
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
53 public V get()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
54 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
55 Reservation r = reservation.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
56 return r.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
57 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
58
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
59 public class Reservation
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
60 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
61 public final Reservation expect;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
62 public final AtomicReference<V> ref;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
63 public final AtomicBoolean flagConfirmed;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
64
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
65 public Reservation(V _object,Reservation _expect,boolean _confirmed)
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
66 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
67 expect = _expect;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
68 ref = new AtomicReference<V>(_object);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
69 flagConfirmed = new AtomicBoolean(_confirmed);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
70 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
71
132
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
72 public void set(V object){
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
73 ref.set(object);
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
74 }
ba5370090393 index commit Prototype
one
parents: 81
diff changeset
75
45
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
76 public V get()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
77 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
78 return ref.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
79 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
80
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
81 public void confirm()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
82 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
83 if(flagConfirmed.compareAndSet(false,true)){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
84 if(reservation.compareAndSet(expect,this) == false){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
85 throw new IllegalStateException("foo!");
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
86 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
87 flagReservation.set(false);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
88 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
89 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
90
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
91 public void cancel()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
92 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
93 if(flagConfirmed.compareAndSet(false,true)){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
94 flagReservation.set(true);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
95 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
96 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
97 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
98 }