disponibilidad comandos clusvcadm cluster alta java class synchronization thread-safety synchronize

java - comandos - clusvcadm



¿Cómo puedo asegurarme de que un método anulado está sincronizado? (3)

Tengo una clase de código común que es seguro para subprocesos.

Uno de los métodos en esa clase es abstracto y debe ser anulado para diferentes implementaciones.

Necesito asegurar o al menos señalar a otros desarrolladores que todas las implementaciones de este método deben ser seguras para subprocesos.

¿Cuál es la mejor manera de hacer esto?

¿Hay una palabra clave o una anotación a este efecto?

Ya probé el abstract synchronized pero esa combinación de palabras clave no está permitida.



No puedes hacerlo directamente. Una cosa que puedes hacer es hacer que el método sea concreto, pero invocar un método abstracto:

public synchronized final void foo() { doFoo(); } protected abstract void doFoo();

De esa manera, doFoo () siempre * se invocará bajo la sincronización establecida por foo ().

* a menos que alguien lo invoque directamente, por lo que debe nombrarlo y documentarlo para que quede claro que no debería.


Este enlace al JLS confirma que no podemos mezclar abstracto y sincronizado.

Aunque es mucho más débil que una palabra clave o una anotación estándar, pero más fuerte que la documentación: ¿quizás intente una interfaz de marcador ?

... proporciona un medio para asociar metadatos con una clase en la que el idioma no tiene soporte explícito para dichos metadatos.

Esto es un estiramiento, pero podría ayudar, ya que la clase derivada hace una declaración ( editar : el nuevo ejemplo prueba la declaración):

interface EatMethodIsThreadSafe {} abstract class Animal { public Animal() { if (! (this instanceof EatMethodIsThreadSafe)) { throw new IllegalArgumentException("eat method must be thread safe"); } } public abstract void eat(); } public class Bear extends Animal implements EatMethodIsThreadSafe { public synchronized void eat() {} public static void main(String...args) { Bear b = new Bear(); } }