java - 在多个线程之间共享对象
问题描述
无法获得count
写入线程中的正确值。它在写入线程中始终为 1,即使它在读取线程中发生变化。
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)
.
推荐阅读
- python - 无法打开文件“hello_world.py”:[Errno 2] 没有这样的文件或目录
- java - 如何使用 SXSSFWorkbook 打开一个大的 excel 模板
- c++ - 两个迭代器的减法如何表示 C++ 中向量项的索引?
- css - Chrome 字体渲染
- node.js - AWS:reactjs 应用程序的连接被拒绝错误
- c - Sqlite 合并 C 文件无法在 Raspbian 上编译
- swift - SwiftUI onDrag。如何提供多个 NSItemProviders?
- algorithm - 给定元素数组,计算长度为“k”的子序列的数量,这些子序列形成具有给定比率“r”的几何级数
- javascript - vega-lite:可调节的选择?
- css - 水平居中对齐 div 与灵活