多线程共享对象
Sharing object between multiple threads
无法在编写器线程中获取 count
的正确值。它在编写器线程中始终为 1,即使它在 reader 线程中发生变化。
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);
}
}
}
输出:
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
请告诉我我的代码有什么问题。
代码未共享 Integer
实例。 count++
等同于:
count = Integer.valueOf(count.intValue() + 1);
即因此,您将新实例重新分配给局部变量 count
。实例本身没有改变(实际上 Integer
是一个不可变类型)。
在多线程场景中,使用 AtomicInteger
可能更好。
旁注: 你几乎总是不应该调用 Integer
构造函数,总是使用 Integer.valueOf(int)
.
无法在编写器线程中获取 count
的正确值。它在编写器线程中始终为 1,即使它在 reader 线程中发生变化。
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);
}
}
}
输出:
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
请告诉我我的代码有什么问题。
代码未共享 Integer
实例。 count++
等同于:
count = Integer.valueOf(count.intValue() + 1);
即因此,您将新实例重新分配给局部变量 count
。实例本身没有改变(实际上 Integer
是一个不可变类型)。
在多线程场景中,使用 AtomicInteger
可能更好。
旁注: 你几乎总是不应该调用 Integer
构造函数,总是使用 Integer.valueOf(int)
.