view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.java @ 146:371b6ddb78f2

repair putAttributeIndex and deleteAttributeIndex
author one
date Fri, 21 Nov 2014 12:46:06 +0900
parents ef183969bf31
children
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 Reservation getReservation(){
		return reservation.get();
	}
	
	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 void set(V object){
			ref.set(object);
		}
		
		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);
			}
		}
	}
}