Mercurial > hg > Members > tatsuki > bench > jungle-core
view 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 |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; public class AtomicReservableReference<V> { public static void main(String _args[]) { String hoge = "hoge"; String fuga = "fuga"; AtomicReservableReference<String> arr = new AtomicReservableReference<String>(hoge); AtomicReservableReference<String>.Reservation r1 = arr.makeReservation(hoge,fuga); //AtomicReservableReference<String>.Reservation r2 = arr.makeReservation(hoge,fuga); System.out.println(arr.get()); r1.confirm(); System.out.println(arr.get()); } private AtomicReference<Reservation> reservation; private AtomicBoolean flagReservation; public AtomicReservableReference(V _ref) { reservation = new AtomicReference<Reservation>(new Reservation(_ref,null,true)); flagReservation = new AtomicBoolean(false); } public Reservation makeReservation(V _expect,V _update) { if(flagReservation.compareAndSet(false,true)){ V value = get(); if(value == _expect){ Reservation expect = reservation.get(); return new Reservation(_update,expect,false); } flagReservation.set(false); } return null; } public void set(V _value) { reservation.set(new Reservation(_value,null,true)); } public V get() { Reservation r = reservation.get(); return r.get(); } public class Reservation { public final Reservation expect; public final AtomicReference<V> ref; public final AtomicBoolean flagConfirmed; public Reservation(V _object,Reservation _expect,boolean _confirmed) { expect = _expect; ref = new AtomicReference<V>(_object); flagConfirmed = new AtomicBoolean(_confirmed); } public V get() { return ref.get(); } public void confirm() { if(flagConfirmed.compareAndSet(false,true)){ if(reservation.compareAndSet(expect,this) == false){ throw new IllegalStateException("foo!"); } flagReservation.set(false); } } public void cancel() { if(flagConfirmed.compareAndSet(false,true)){ flagReservation.set(true); } } } }