Compartir objetos entre múltiples hilos

Priyatam Roy:

No se puede obtener el valor correcto de counten hilo de escritor. Siempre es 1 en el escritor hilo a pesar de que está cambiando en hilo lector.

public class ReaderWriter1 {

    public static void main(String args[]) {

        Semaphore rs = new Semaphore(1);
        Integer count = new Integer(0);

        Thread r1 = new Thread(new Reader("Reader 1", rs, count++));
        Thread w1 = new Thread(new Writer("Writer 1", count));
        w1.start();
        r1.start();
    }
}

class Reader implements Runnable {

    String tName;
    Semaphore rs;
    Integer count;

    Reader(String tName, Semaphore rs, Integer count) {
        this.tName = tName;
        this.rs = rs;
        this.count =  count;
    }

    @Override
    public void run() {
        try {
            read();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    void read() throws InterruptedException {
        while(true) {

            rs.acquire();
            count++;
            rs.release();
            System.out.println("Count in reader: " + count);
            Thread.sleep(1000);
        }
    }

}

class Writer implements Runnable {

    String tName;
    Integer count;

    Writer(String tName, Integer count) {
        this.tName = tName;
        this.count =  count;
    }

    @Override
    public void run() {

        try {
            write();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }

    }

    void write() throws InterruptedException {
        while(true) {
            System.out.println("Count in writer: " + count);
            Thread.sleep(1000);
        }
    }

}

Salida:

Count in writer: 1
Count in reader: 1
Count in writer: 1
Count in reader: 2
Count in reader: 3
Count in writer: 1
Count in writer: 1
Count in reader: 4
Count in writer: 1
Count in reader: 5
Count in writer: 1
Count in reader: 6
Count in writer: 1
Count in reader: 7
Count in reader: 8
Count in writer: 1
Count in reader: 9
Count in writer: 1

Por favor, hágamelo saber lo que está mal en mi código.

M Anouti:

El código no está compartiendo la Integerinstancia. count++es equivalente a:

count = Integer.valueOf(count.intValue() + 1);

es decir, para que vuelvan a asumir una nueva instancia de la variable local count. La instancia de sí mismo no se cambia (de hecho Integeres un tipo inmutable).

En los escenarios de multiproceso, podría ser mejor usar una AtomicInteger.

Nota al margen: que casi siempre no invocar el Integerconstructor, utilizar siempre Integer.valueOf(int).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=361708&siteId=1
Recomendado
Clasificación