我对学校的线程练习有疑问,我们只是在学习线程/同步,我有点迷茫。
基本上我想启动某个类的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/