Priyatam Roy:
No se puede obtener el valor correcto de count
en 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 Integer
instancia. 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 Integer
es un tipo inmutable).
En los escenarios de multiproceso, podría ser mejor usar una AtomicInteger
.
Nota al margen: que casi siempre no invocar el Integer
constructor, utilizar siempre Integer.valueOf(int)
.