Pregunta

Considere una variable de tipo primitivo con una gran cantidad de hilos de lectura y unos hilos de escritura, lo hará el siguiente código funcione correctamente?

Si lo hará, ¿Proporciona un mejor rendimiento que 1). declarando sincronizada en todos los métodos; 2). utilizando un ReadWriteLock explícito?

Es este un patrón común? Si no es así, qué patrón se utiliza generalmente en esta situación?

Esta actualmente funciona bien para mí, pero siento que es un poco redundante utilizar tanto volátil y sincronizado.

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}
¿Fue útil?

Solución

  

Considere una variable de tipo primitivo con una gran cantidad de hilos de lectura y unos hilos de escritura, lo hará el siguiente código funcione correctamente?

Creo que sí.

  

Si lo hará, ¿Proporciona un mejor rendimiento que 1). declarando sincronizada en todos los métodos; 2). utilizando un ReadWriteLock explícito?

Creo que sí, siempre que las operaciones de lectura superan en número a las peticiones de escritura. Sin embargo:

  • A menos que este contador es muy sostuvo, es probable que no importa. No pierda su tiempo algo micro-optimización a menos que tenga evidencia de que es (o será) un cuello de botella.
  • Si lo que realmente importa a usted, referente ella.
  • No se sorprenda si el rendimiento relativo depende de las versiones de JVM / niveles de parches, opciones de JVM y el hardware; p.ej. número de procesadores y arquitectura de memoria.
  

Es este un patrón común? Si no es así, qué patrón se utiliza generalmente en esta situación?

No sé si esto es común. Pero mi sensación es que el enfoque más común es usar la sincronización regular, y no preocuparse por ello. A no ser que se trata de una estructura de datos altamente sostenido, la diferencia de rendimiento entre los diferentes enfoques será insignificante para el rendimiento general de la aplicación.

Otros consejos

Sí, es común que, al menos hasta cierto punto:)

El patrón está utilizando se describe en este artículo IBM -> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(patrón # 5, barato de lectura-escritura de bloqueo truco)

Estoy seguro de que proporciona un mejor rendimiento, ya que no hay bloqueo, pero si es correcto depende de la intención del código. Por supuesto, el comportamiento es diferente del caso sincronizada. Si el comportamiento es similar al caso de bloqueo depende de dónde se bloquea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top