Pregunta

tenemos dos hilos que acceden a una lista a través de un método sincronizado. ¿Podemos

a) confíe en el tiempo de ejecución para asegurarse de que cada uno de ellos reciba acceso al método en función del orden que intentaron o

b) ¿la VM sigue otras reglas?

c) ¿hay una mejor manera de serializar las solicitudes?

¿Fue útil?

Solución

No, sincronizado dará acceso en cualquier orden (depende de la implementación de JVM). Esto incluso podría causar que los subprocesos se mueran de hambre en algunos escenarios.

Puede garantizar el pedido utilizando ReentrantLock (desde Java 5.0) con la opción fair = true . ( Lock lock = new ReentrantLock (true); )

Otros consejos

No, no puede estar seguro de que se realizarán dos llamadas a un método sincronizado en orden. El orden no está especificado y depende de la implementación.

Esto se define en 17.1 Bloqueos sección de la JLS. Tenga en cuenta que esto no dice nada sobre el orden en que los subprocesos que esperan en un bloqueo deben obtener acceso.

No puede confiar en el orden en que se llama al método particular desde cada subproceso. Si es solo dos hilos puede ser sí. Pero imagínate si hay 3 hilos y 1 hilo ya adquirido de acceso. Los otros 2 subprocesos cuando intenten acceder esperarán y a cualquiera de ellos se le puede otorgar el acceso, y esto no depende del orden en el que llamaron a este método. Por lo tanto, no se sugiere confiar en el pedido.

  

c) ¿hay una mejor manera de serializar las solicitudes?

¿Está usted por casualidad utilizando la lista como una cola, es decir, el patrón de uso se ve así?

while (some condition) {
    synchronized(theList){
        anItem = get and remove an element from theList
    }
    do some work with anItem
}

Si es así, puede consultar el BlockingQueue en lugar de usar tus propios esquemas de bloqueo. Las implementaciones (como ArrayBlockingQueue ) tiene configuraciones para ser justos y más.

Siempre dejo sincronizaciones al servidor de aplicaciones o al motor a menos que defina su propia intensidad

Sí.

Si el acceso a la lista es a través de un método sincronizado, se serializarán las solicitudes simultáneas de varios subprocesos.

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