gpt4 book ai didi

Java线程问题?

转载 作者:行者123 更新时间:2023-11-29 09:52:27 24 4
gpt4 key购买 nike

我想知道为什么结果不是400 000。有两个线程为什么会被阻塞?

class IntCell {
private int n = 0;
public int getN() {return n;}
public void setN(int n) {this.n = n;}
}
class Count extends Thread {
private static IntCell n = new IntCell();
@Override public void run() {
int temp;
for (int i = 0; i < 200000; i++) {
temp = n.getN();
n.setN(temp + 1);
}
}
public static void main(String[] args) {
Count p = new Count();
Count q = new Count();
p.start();
q.start();
try { p.join(); q.join(); }
catch (InterruptedException e) { }
System.out.println("The value of n is " + n.getN());
}
}

为什么会有这么大的问题?

最佳答案

因为递增变量的方式并不是真正递增变量的原子操作:

  1. 获取之前的值
  2. 给这个值加一
  3. 设置新值

它们不是原子完成的 3 个操作,您应该使用 synchronized block 或使用 AtomicInteger 代替。

对于 synchronized block ,它会是这样的:

synchronized (n) {
temp = n.getN();
n.setN(temp + 1);
}

对于 AtomicInteger,您需要如下重写代码:

class IntCell {
private final AtomicInteger n = new AtomicInteger();
public int getN() {return n.get();}
public void incrementN(int n) {this.n.addAndGet(n);}
}

for (int i = 0; i < 200000; i++) {
n.incrementN(1);
}

使用AtomicInteger 的方法是非阻塞的,所以会更快

关于Java线程问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37497431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com