Code example for AtomicReference

Methods: compareAndSet, get

0
	 * nodo es creado, bloqueando al resto de los threads hasta que es creado 
	 *  
	 * @return El nodo global 
	 */ 
	public static Nodo getNode() { 
		Nodo nodo = rootNodeRef.get();
		if (nodo != null) {
			// Ya lo crearon 
			return nodo;
		} 
		return crearNodoUnico(); 
	} 
 
	public static TaskProcessor getProcessor() { 
		TaskProcessor processor = rootProcessorRef.get();
		if (processor != null) {
			// Ya fue creado 
			return processor;
		} 
		return crearProcessorUnico(); 
	} 
 
	/** 
	 * Intenta crear un procesador unico para la referencia de la clase. Puede fallar si se adelanta 
	 * otro thread en cuyo caso devuelve el creado por el otro thread 
	 *  
	 * @return El procesador usado como unica instancia 
	 */ 
	private static TaskProcessor crearProcessorUnico() { 
		ExecutorBasedTaskProcesor possibleProcessor = ExecutorBasedTaskProcesor.create(createAndroidProcessorConfig());
		boolean setted = rootProcessorRef.compareAndSet(null, possibleProcessor);
		if (setted) {
			// El que creamos el es procesador que se utilizara 
			return possibleProcessor;
		} 
		TaskProcessor uniqueProcessor = rootProcessorRef.get();
		if (uniqueProcessor == null) {
			throw new UnhandledConditionException( 
					"La referencia al procesador no permitio setearle uno nuevo pero devolvio null como actual"); 
		} 
		return uniqueProcessor;
	} 
 
	/** 
	 * Intenta crear un unico nodo central como referencia de la clase. Puede fallar si otro thread 
	 * se adelanta, en cuyo caso usa el del otro thread 
	 *  
	 * @return El nodo unico 
	 */ 
	private static Nodo crearNodoUnico() { 
		MultiplexorParalelo possibleNode = MultiplexorParalelo.create(getProcessor());
		boolean setted = rootNodeRef.compareAndSet(null, possibleNode);
		if (setted) {
			// Somos los primeros en setear, el nodo que creamos es el unico 
			return possibleNode;
		} 
		Nodo uniqueNode = rootNodeRef.get();
		if (uniqueNode == null) {
			throw new UnhandledConditionException( 
					"La referencia al no no permitio setearle uno nuevo pero devolvio null como actual"); 
		} 
		return uniqueNode;