bloques atómicos en Java para datos coincidentes

Una biblioteca que estoy escribiendo tiene una clase que implementa un mapa bidimensional y también proporciona, para una lectura eficiente, mapas más pequeños para las vistas de fila / columna. Hasta ahora, todos los métodos se han anulado para que cualquier cambio en el mapa principal se refleje en los submapas y viceversa. El problema viene en la operación concurrente.

Idealmente, la eliminación de un elemento del mapa maestro eliminará simultáneamente el elemento de los mapas de fila y columna respectivos, pero esto es, por supuesto, imposible. Por ejemplo en mi función put:

public synchronized Cell put(Duple<Integer, Integer> key, Cell arg1){
    //preprocessing, detecting the row/col, creating row/col if not present yet, etc.
    Cell outcell = super.put(key, arg1);
    rowArr.putPriv(key.getElem2(), arg1);
    colArr.putPriv(key.getElem1(), arg1);
    arg1.assignCell(this, key);
    return outCell;
}

Si bien es perfectamente aceptable para lecturas simultáneas del mapa e incluso la modificación concurrente no es un problema (excepto la creación / eliminación de filas / columnas que deben eliminarse y ponerse a sincronizar), sino las 4 etapas de modificación (super.put , la colocación de filas y columnas y la actualización de la ubicación de la celda) deben ser atómicas para garantizar que no sea posible leer datos no coincidentes.

¿Cuáles son mis opciones? Por lo que he encontrado en mi búsqueda, no es posible crear una secuencia atómica de declaraciones en Java, y la sincronización no funcionará a menos que sincronice todas mis funciones (lo que impide lecturas concurrentes, y necesitaría bloqueos en múltiples artículos). Conozco los principios de los conceptos básicos de semáforos (pero no estoy particularmente entrenado en ellos), pero no veo ninguna manera simple de hacer un semáforo de bloqueo en escritura sin una complejidad masiva, particularmente si no quiero tener esperas masivas para Un espacio para escribir. ¿Qué opciones adicionales tengo?

Nota: debido al proyecto en el que estoy, no puedo usar lenguajes derivados como groovy, pero solo puedo usar Java 1.6u24 estándar, sin bibliotecas de terceros.

Respuesta 1

tl; dr: quiero tomar una cadena como: ab% cde% fg hij% klm n% op Y convertirla a cualquiera de (todos son aceptables): 'ab'% c'de '% f'g hij'% k'lm n '% o'p' 'ab'% c'de '% f'g' 'hij'% k'lm '' n '% o'p' 'a''b'% c'd ' 'e'% f '...

Estoy consultando la base de datos. Y tratando de conectar los datos de una tabla en particular y mostrarlos como un xml. Intenté el siguiente código, pero aún así el xml está vacío. Todavía estoy comprobando cuál es el ...

Hola chicos !!! Tengo una cadena con valores como 69 17 17 16 2 1 1 26 26 56 56 69 20 19 20 etc. Ahora según mi necesidad, tengo que poner estos valores en una nueva cadena con cada valor en una nueva línea ...

He creado un proyecto en jdk 1.6 y android Rev. 20. Ahora he instalado 1.7 para algunas características, pero no acepta. Tenemos que importar el paquete sun.audio en java 1.7 que pretendemos usar en ...