annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.java @ 81:715a9fbf02fc

remove <T> many source
author one
date Sun, 31 Aug 2014 07:46:30 +0900
parents fb00d7b147c8
children ba5370090393
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
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
49 public V get()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
50 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
51 Reservation r = reservation.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
52 return r.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
53 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
54
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
55 public class Reservation
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
56 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
57 public final Reservation expect;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
58 public final AtomicReference<V> ref;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
59 public final AtomicBoolean flagConfirmed;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
60
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
61 public Reservation(V _object,Reservation _expect,boolean _confirmed)
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
62 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
63 expect = _expect;
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
64 ref = new AtomicReference<V>(_object);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
65 flagConfirmed = new AtomicBoolean(_confirmed);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
66 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
67
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
68 public V get()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
69 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
70 return ref.get();
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
71 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
72
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
73 public void confirm()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
74 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
75 if(flagConfirmed.compareAndSet(false,true)){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
76 if(reservation.compareAndSet(expect,this) == false){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
77 throw new IllegalStateException("foo!");
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
78 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
79 flagReservation.set(false);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
80 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
81 }
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
82
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
83 public void cancel()
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
84 {
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
85 if(flagConfirmed.compareAndSet(false,true)){
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
86 flagReservation.set(true);
fb00d7b147c8 added JungleTree service
Shoshi TAMAKI
parents:
diff changeset
87 }
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 }