En nuestro sistema, tenemos un método que va a hacer un trabajo cuando se llama con un cierto ID:Java: ¿Sincronización en primitivas?
public void doWork(long id) { /* ... */ }
Ahora, este trabajo se puede hacer al mismo tiempo para diferentes identificadores, pero si el método se llama con el mismo ID por 2 hilos, un hilo debe bloquearse hasta que se termine.
La solución más simple sería tener un mapa que se correlacione desde la ID larga con algún objeto arbitrario que podamos bloquear. Un problema que preveo con esto es que podemos tener toneladas de identificaciones en el sistema y este mapa seguirá creciendo todos los días.
Idealmente, creo que necesitamos un sistema en el que cada hilo busque un objeto de bloqueo, bloquee cuando sea posible, haga el trabajo y luego indique que hemos terminado con el bloqueo. Si está claro que nadie más está utilizando este bloqueo en particular, retírelo con seguridad del mapa de bloqueo para evitar la pérdida de memoria.
Imagino que este debe ser un escenario bastante común, así que espero que exista una solución existente. Alguien sabe de alguno?
¿Cómo se producen estos números de identificación? Si hay algún corretaje de estos ID, simplemente distribuya objetos en lugar de primitivos y puede usarlos para bloquear/sincronizar. –
Ver también http://stackoverflow.com/q/6616141/32453 – rogerdpack