Java: múltiples subprocesos que disminuyen la variable estática a través del método sincronizado que accede a la variable al mismo tiempo

Lo que sucede en el código original es lo siguiente:

  1. Hilo uno decrementos cuenta (cuenta -> 9)
  2. Hilo dos decrementos cuenta (cuenta -> 8)
  3. Hilo cuenta tres decrementos (cuenta -> 7)
  4. Hilo cuenta cuatro decrementos (cuenta -> 6)
  5. Hilo uno salidas cuenta (cuenta: 6)
  6. Rosca dos salidas cuenta (cuenta: 6)
  7. Hilo tres salidas cuenta (cuenta: 6)
  8. Rosca cuatro salidas cuenta (cuenta: 6)

Como está bloqueando el decremento y no el decremento y la salida juntos, parece disminuir varias veces.

En otras palabras, no hay garantía de que este código se ejecute de forma consecutiva:

        this.decrement();
        System.out.print(this.getCount() + ",");

Aquí está el código fijo. Devuelve el valor de recuento actual en decremento para que el nuevo valor pueda devolverse e imprimirse.

public class Person extends Thread {

    private static int count = 10;

    public int decrement() {
        synchronized(Person.class) {
            count = count - 1;
            return count;
        }

    }

    public int getCount() {
        synchronized(Person.class) {
            return count;
        }
    }

    public void run(){
        while( getCount() > 0){
            int count = this.decrement();
            System.out.println(count);
        }
    }
}

Sin embargo, recomendaría AtomicInteger para esta tarea:

import java.util.concurrent.atomic.AtomicInteger;

public class Person extends Thread {

    private static AtomicInteger count = new AtomicInteger(10);

    public int decrement() {
        return count.decrementAndGet();
    }

    public void run(){
        while(count.get() > 0){
            int currentCount = this.decrement();
            System.out.print(currentCount + ",");
        }
    }
}
Respuesta 1

Actualmente estoy probando una interfaz para Java que permite usar llamadas R con Java. Por lo tanto, necesito una conexión que también encapsule un proceso. Ahora necesito saber cómo JUnit procesa esa Unidad ...

Tengo un archivo de propiedades que debe cargarse en un programa Java. Parte de la ruta está definida por la variable de entorno del sistema JAVA_TOP. Cuando doy la ruta completa, reconoce el archivo. ...

Estoy usando Slick 3.1.0 y necesito persistir el campo de tipo java.time.LocalDate. Tengo la clase de modelo: case class Position (companyName: String, title: String, startDate: Option [LocalDate], ...

import java.io.FileNotFoundException; import java.util.Formatter; import java.util.FormatterClosedException; import java.util.NoSuchElementException; import java.util.Scanner; clase pública ...