gpt4 book ai didi

java - 多线程同步问题

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

我对学校的线程练习有疑问,我们只是在学习线程/同步,我有点迷茫。

基本上我想启动某个类的4个线程。每个线程将运行 25 次并打印出数字 1---100。

输出应该是这样的

线程 1: 1

线程 3:2

线程 4:3

线程 2:4

.

.

.

.

线程 3:100

但是实际打印出来的是这样的。它很重要,但没有正确吐出数字。

线程 1: 1

线程 3:1

线程 4:5

线程 2:6

线程 3:7

线程 3:8

线程 1:9

线程 2:10

线程 4:10

.

.

.

.

线程 3:100

这是我正在线程化的类的代码

public class numberentrycreater implements Runnable
{
final private int max = 100;
private static int count = 1;
private String createdBy;
private SharedBuffer buffer;

public numberentrycreater(String createdBy ){
this.createdBy = createdBy;
}

public synchronized void increment(NumberEntry ne){
System.out.println(ne.getCreatedBy()+": " + ne.getValue());
if(count<=max){
count++;
}
}

@Override
public void run()
{
for(int i=0; i<25; i++){
if(count<=max){
NumberEntry ne = new NumberEntry(count,createdBy);
increment(ne);
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

我认为问题在于 NumberEntry 对象的创建。但我不太确定如何解决它。如果有人能以任何方式帮助我,那就太好了:)。

最佳答案

这里的同步有点乱,你会遇到很多竞争条件。

首先,您要创建 NumberEntry在你进入同步方法之前,所以没有理由认为多个线程不会选择相同的数字。

另外,synchronized 方法实际上不会被同步。 synchronized作为方法选项只是 synchronized(this) { ... } 的简写, 和 this在这种情况下是可运行的,每个线程都是唯一的,所以它们可以同时进入它。您需要同步他们共享的内容。尝试在 synchronized(numberentrycreater.class) { <method code> } 的方法中放置一个 block 相反。

编辑:

ControlAltDel 建议使用 next()同步方法而不是 increment更优雅,更不容易出问题。不过,它仍然存在同步错误的问题(在撰写本文时)。

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

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