静态int变量是否安全?

时间:2014-04-28 17:33:27

标签: java multithreading

我在考试中被问到这个问题,用多线程计算单词。有很多方法可以完成上述任务。生产者/消费者同步,其他人没有同步。我偶然发现的是使用静态变量来保持所有线程的单词总数。我想计算所有文件中的总单词数。我编写了这段代码并且预计不会工作,因为静态变量不是线程安全的。我的问题是静态变量是不是线程安全的,那么为什么下面的代码工作。

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;
    }
}

2 个答案:

答案 0 :(得分:2)

不是线程安全并不意味着永远不会工作。这意味着并不总是按预期工作。使用您的示例,您可以更改numThreads或totalCount,但在打印之前,这些变量将由另一个线程更新。您应该避免在线程之间共享非最终变量,如果不能,则应使用synchronized强制线程排队使用变量。但是,同步不是万灵药,所以你仍然需要注意你正在做的事情以及为什么。

答案 1 :(得分:0)

我不这么认为......因为它们是静态的

对于int基元,您需要将它们包装在“synchronized”方法或块中。