Diferencias entre usar sincronizado (obj) y un bloqueo declarado

Estoy tratando de sincronizar este método run (). Me gustaría que solo ingrese un hilo a la vez, pero no entiendo por qué la solución me dice que use el método sincronizado (obj) :

public Tabellina(Contatore o, int num) {
    obj = o; 
    numero = num;
    r = new Random(); 
    start();
}

public void run() {
    synchronized(obj) {
        for (int j=0; j<10; j++) {
            obj.incr();
            try { 
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
        }
        try { 
            Thread.sleep(r.nextInt(2000));
        } catch (InterruptedException e) { }
    }}
}

Mi idea era crear un bloqueo y sincronizarlo de esta manera:

public Tabellina(Contatore o, int num) {
    obj = o; 
    numero = num;
    r = new Random(); 
    l1 = new ReentrantLock();
    start();
}

public synchronized void run() {
    l1.lock();
        for (int j=0; j<10; j++) {
            obj.incr();
            try { 
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
        }
        try { 
            Thread.sleep(r.nextInt(2000));
        } catch (InterruptedException e) { }
    l1.unlock();
    }
}

Pero no funciona porque los hilos imprimen el contenido de forma alternativa. ¿Como es posible? Si uso el bloqueo () al comienzo del método de ejecución, ¿no debería el primer subproceso completar el for y luego liberar el bloqueo y dejar que el segundo subproceso entre en el método?

Respuesta 1

Estoy atrapado en un proyecto en mi introducción a la clase Java. Tenemos que crear un código que convierta un número en un número de punto fijo. Tengo esa parte bien, pero donde estoy atrapado es en las matemáticas ...

Quiero construir un contenedor de descanso en una aplicación de arranque de primavera que acepte cualquier tipo de solicitud (llamada API). Supongamos que tengo dos llamadas API / employee / 123 (método GET) / dept / 123 (método PUT). Ahora cuando yo ...

Tengo este extraño problema de "No se puede encontrar Spring NamespaceHandler para el espacio de nombres de esquema XML". Estoy haciendo referencia al espacio de nombres GATE en el contexto de mi aplicación de primavera. Es un jar ejecutable en el que ...

Soy nuevo en codificación. Así que tengo un interruptor donde la aplicación puede elegir la próxima actividad usando la cadena nextActivityExtra. Los intent.putExtra son necesarios para las otras actividades y ninguna actividad tiene ...