我在考试中被问到这个问题,用多线程计算单词。有很多方法可以完成上述任务。生产者/消费者同步,其他人没有同步。我偶然发现的是使用静态变量来保持所有线程的单词总数。我想计算所有文件中的总单词数。我编写了这段代码并且预计不会工作,因为静态变量不是线程安全的。我的问题是静态变量是不是线程安全的,那么为什么下面的代码工作。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class WordCount implements Runnable {
String fileName;
static int totalCount = 0;
static int numThreads = 0;
public WordCount(String[] files) {
for (String file : files) {
new Thread(this, file).start();
}
}
public void run() {
int count = 0;
try {
Scanner in = new Scanner(new File(Thread.currentThread().getName()));
while (in.hasNext()) {
in.next();
count++;
}
System.out.println(Thread.currentThread().getName() + ": " + count);
totalCount += count;
numThreads++;
totalCount();
} catch (FileNotFoundException e) {
System.out.println(Thread.currentThread().getName() + ": Not Found");
}
}
public void totalCount() {
if (numThreads == 3) {
System.out.println("total: " + totalCount);
}
}
public int getTotalWords() {
return totalCount;
}
}
答案 0 :(得分:2)
不是线程安全并不意味着永远不会工作。这意味着并不总是按预期工作。使用您的示例,您可以更改numThreads或totalCount,但在打印之前,这些变量将由另一个线程更新。您应该避免在线程之间共享非最终变量,如果不能,则应使用synchronized强制线程排队使用变量。但是,同步不是万灵药,所以你仍然需要注意你正在做的事情以及为什么。
答案 1 :(得分:0)
我不这么认为......因为它们是静态的
对于int基元,您需要将它们包装在“synchronized”方法或块中。