/* * JBoss, Home of Professional Open Source * Copyright 2011 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.atomic; import java.util.Map; import org.infinispan.util.concurrent.IsolationLevel; import org.infinispan.atomic.AtomicMapLookup; /** * FineGrainedAtomicMap is a special type of Map geared for use in Infinispan. FineGrainedAtomicMap has * two major characteristics: * * <ol> * <li>Atomic locking and isolation is applied on keys of FineGrainedAtomicMap rather than entire map itself</li> * <li>Fine-grained serialization of deltas</li> * </ol> * * <b><u>1. Fine-grained atomic locking and isolation</u></b> * <p> * FineGrainedAtomicMap allows fine grained locking of entries within the map; it also isolates the map for safe * reading (see {@link IsolationLevel} while concurrent writes may be going on. * </p> * <br /> * <b><u>2. Fine-grained serialization of deltas</u></b> * <p> * AtomicMap implementations also implement the {@link DeltaAware} interface. This powerful interface allows the * generation and application of deltas, and requires that implementations are capable of tracking changes made to it * during the course of a transaction. This helps since when performing replications to update remote nodes, the * <i>entire</i> map need not be serialized and transported all the time, as serializing and transporting {@link Delta} * instances would work just as well, and typically be much smaller and hence faster to serialize and transport. * </p> * <br /> * <br /> * <b><u>Usage</u></b> * <p> * FineGrainedAtomicMap should be constructed and "registered" with Infinispan using the {@link AtomicMapLookup} helper. This * helper ensures thread safe construction and registration of AtomicMap instances in Infinispan's data container. E.g.: * <br /> * <code> * FineGrainedAtomicMap<String, Integer> map = AtomicMapLookup.getFineGrainedAtomicMap(cache, "my_atomic_map_key"); * </code> * </p> * <p><b><u>Referential Integrity</u></b><br /> * It is important to note that concurrent readers of an AtomicMap will essentially have the same view of the contents * of the underlying structure, but since AtomicMaps use internal proxies, readers are isolated from concurrent writes * and {@link IsolationLevel#READ_COMMITTED} and {@link IsolationLevel#REPEATABLE_READ} semantics are guaranteed. * However, this guarantee is only present if the values stored in an AtomicMap are <i>immutable</i> (e.g., Strings, * primitives, and other immutable types).</p> * * <p>Mutable value objects which happen to be stored in an AtomicMap may be updated and, prior to being committed, * or even replaced in the map, be visible to concurrent readers. Hence, AtomicMaps are <b><i>not suitable</i></b> for * use with mutable value objects.</p> * </p> * <br /> * <p> * This interface, for all practical purposes, is just a marker interface that indicates that maps of this type will * be locked atomically in the cache and replicated in a fine grained manner, as it does not add any additional methods * to {@link java.util.Map}. * </p> * * @author Vladimir Blagojevic * @see DeltaAware * @see Delta * @see AtomicHashMap * @see AtomicMapLookup * @since 5.1 */ public interface FineGrainedAtomicMap<K, V> extends Map<K, V> { }