variable sincronizacion sentencia programas hilos ejemplo con java multithreading hibernate synchronization

sincronizacion - synchronized java ejemplo



¿Cómo funcionan los métodos estáticos sincronizados en Java? (7)

¿Por qué quiere hacer cumplir que solo un hilo puede acceder al DB en cualquier momento?

El trabajo del controlador de la base de datos es implementar cualquier bloqueo necesario, ¡suponiendo que una Connection solo sea utilizada por un hilo a la vez!

Lo más probable es que su base de datos sea perfectamente capaz de manejar múltiples accesos paralelos

Si tengo una clase util con métodos estáticos que llamarán a las funciones de Hibernate para lograr el acceso a los datos básicos. Me pregunto si synchronized el método es el enfoque correcto para garantizar la seguridad del hilo.

Quiero que esto impida el acceso de información a la misma instancia de base de datos. Sin embargo, estoy seguro de que si el siguiente código impide que getObjectById se getObjectById para todas las clases cuando una clase en particular lo llame.

public class Utils { public static synchronized Object getObjectById (Class objclass, Long id) { // call hibernate class Session session = new Configuration().configure().buildSessionFactory().openSession(); Object obj = session.load(objclass, id); session.close(); return obj; } // other static methods }


Al usar sincronizado en un bloqueo de método estático, sincronizará los métodos y atributos de clase (a diferencia de los métodos y atributos de instancia)

Entonces tu suposición es correcta.

Me pregunto si sincronizar el método es el enfoque correcto para garantizar la seguridad del hilo.

Realmente no. Deberías dejar que funcione tu RDBMS en su lugar. Ellos son buenos en este tipo de cosas.

Lo único que conseguirá al sincronizar el acceso a la base de datos es hacer que su aplicación sea terriblemente lenta. Además, en el código que ha publicado usted está creando una fábrica de sesiones cada vez, de ese modo, su aplicación pasará más tiempo accediendo al DB que realizando el trabajo real.

Imagine el siguiente escenario:

El cliente A y B intentan insertar información diferente en el registro X de la tabla T.

Con su enfoque, lo único que está consiguiendo es asegurarse de que se invoque uno después del otro, cuando esto ocurra de todos modos en el DB, porque el RDBMS impedirá que inserten la mitad de la información de A y la mitad de B al mismo tiempo . El resultado será el mismo pero solo 5 veces (o más) más lento.

Probablemente sea mejor echarle un vistazo al capítulo "Transacciones y concurrencia" en la documentación de Hibernate. La mayoría de las veces, los problemas que intentas resolver ya se han resuelto y de una manera mucho mejor.


Los métodos estáticos usan la clase como el objeto para bloquear, que es Utils.class para su ejemplo. Entonces sí, está bien.


Para abordar la pregunta de manera más general ...

Tenga en cuenta que el uso sincronizado en métodos es solo una abreviatura (supongamos que la clase es SomeClass):

synchronized static void foo() { ... }

es lo mismo que

static void foo() { synchronized(SomeClass.class) { ... } }

y

synchronized void foo() { ... }

es lo mismo que

void foo() { synchronized(this) { ... } }

Puedes usar cualquier objeto como el candado. Si desea bloquear subconjuntos de métodos estáticos, puede

class SomeClass { private static final Object LOCK_1 = new Object() {}; private static final Object LOCK_2 = new Object() {}; static void foo() { synchronized(LOCK_1) {...} } static void fee() { synchronized(LOCK_1) {...} } static void fie() { synchronized(LOCK_2) {...} } static void fo() { synchronized(LOCK_2) {...} } }

(para los métodos no estáticos, le conviene hacer que los bloqueos sean campos no estáticos)


Para responder a su pregunta, sí lo hace: su método synchronized no puede ser ejecutado por más de un hilo a la vez.


Si se trata de algo relacionado con los datos en su base de datos, ¿por qué no utilizar el bloqueo de aislamiento de la base de datos para lograrlo?


static synchronized significa mantener el bloqueo en el objeto Class la clase, mientras que synchronized significa mantener el bloqueo en el objeto de esa clase. Eso significa que, si está accediendo a un método sincronizado no estático en un hilo (de ejecución), puede acceder a un método sincronizado estático utilizando otro hilo.

Por lo tanto, no es posible acceder a dos métodos del mismo tipo (ya sean dos métodos estáticos o dos métodos no estáticos) en cualquier punto en más de un subproceso.