gpt4 book ai didi

java - Java线程同步问题

转载 作者:行者123 更新时间:2023-11-29 04:08:45 29 4
gpt4 key购买 nike

我很清楚这可能被认为是重复的,但是考虑到我在这里遇到的问题,我浏览了很多答案,但我无法提出解决方案。

我将我的 runnable 与一个由多个线程共享的对象同步,并显式同步了我在内部使用的方法,但程序的结果始终是 3000。

我尝试锁定 Counter 类,但它不会改变任何事情。谁能解释一下为什么我的操作在这个特定示例中都不起作用?

    public static void zad3() {
var counter = new Counter();

var toRun = new Runnable() {
@Override
public void run() {
synchronized (counter) {
for (var i = 0; i < 1000; i++) {
counter.add(1);
}
}
}
};

var t1 = new Thread(toRun);
var t2 = new Thread(toRun);
var t3 = new Thread(toRun);

t1.start();
t2.start();
t3.start();

try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("counter = " + counter.getCount());
}
public class Counter {
protected long count_ = 0;

public synchronized void add(long value) {
count_ += value;
}

public long getCount() {
return count_;
}
}

编辑:正如建议的那样,问题出在每个线程不断运行 1000 次的循环中。我的解决方案:

        var toRun = new Runnable() {
@Override
public void run() {
synchronized (counter) {
for (var i = counter.getCount(); i < 1000; i++) {
counter.add(1);
}
}
}
};

最佳答案

好吧,您已经围绕“counter”变量同步了完整的 for 循环,这意味着每个线程将运行一次 block 。 3 X 1000 = 3000

这个 block 将每个线程执行一次

 for (var i = 0; i < 1000; i++) {
counter.add(1);
}

更新:根据您的评论判断您想要中断 1000 示例代码可以是:

 t1.start();
t2.start();
t3.start();

while(counter.getValue()<1000) {
Thread.sleep(20)
}

另一个建议:

public class Incremetor extends Runnable {
Counter counter;

public Incremetor(Counter counter) {
this.counter = counter;
}
public void run() {
counter.increment();
}

}

ExecutorService executorService = Executors.newFixedThreadPool(8); // this mean 8 threads in total to do your runnables.
for (int i=0;i<1000;++i) {
executorService.submit(new Incrementor(counter));
}

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

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