java中的线程安全函数,用于计算句子中的单词数

java中的线程安全函数,用于计算句子中的单词数,java,thread-safety,Java,Thread Safety,我接受了采访,要求我写一个函数来计算句子中的单词数。该函数应该是线程安全的。 下面的方法适用吗 public static synchronized int find(String str){ int count=0; boolean word= false; char[] ch = str.toCharArray(); for(int i =0;i<ch.length;i++){ if(!(ch[i]==' ')){

我接受了采访,要求我写一个函数来计算句子中的单词数。该函数应该是线程安全的。 下面的方法适用吗

public static synchronized int find(String str){

    int count=0;
    boolean word= false;

    char[] ch = str.toCharArray();
    for(int i =0;i<ch.length;i++){
        if(!(ch[i]==' ')){
            for(int j=i;j<ch.length;j++,i++){
                if(!(ch[j]==' ')){
                    word= true;
                    if(j==ch.length-1){
                        count++;
                    }
                    continue;
                }
                else{
                    if(word){
                        count++;
                    }
                    word = false;
                }
            }
        }
        else{
            continue;
        }
    }
    return count;   
}
publicstaticsynchronizedintfind(stringstr){
整数计数=0;
布尔字=假;
char[]ch=str.toCharArray();

对于(int i=0;i如果方法的所有变量/实例都是本地的,并且参数是线程安全的,则该方法是线程安全的

这将是我的实现(没有局部变量):

这里唯一的对象是字符串参数。在java中,
String
是不可变的,因此是线程安全的,所以这个实现是线程安全的



注意:所谓“局部变量”,我的意思是“保存原语或对本地创建对象的引用的变量”。

您不需要做任何异常的事情来确保函数线程安全;它不访问任何共享资源。(希望这不是采访问题的目的,因为我不想为您破坏它。)顺便说一句,另请参见。您几乎必须尝试使此线程不安全。(我说几乎是因为不了解局部变量和类字段之间的区别的人可能会在此处为某些内容创建静态字段。)虽然这个函数似乎有效,但你很可能面试失败了。你的代码不必要地复杂,而且很容易出现错误。双循环是多余的,而内循环修改
i
这一事实非常令人困惑。
j
是多余的;无论何时使用,它都与
i
具有相同的值。标记method
synchronized
是不必要的。整个问题可以通过库调用在一行中解决。我不允许使用库函数。我仍然使用字符串长度。我想知道面试问题的目的是否是使用分而治之的方法,以便您可以使用多个核来计算wo的数量rds?从给出的小信息来看,这是我的猜测。“如果你的方法只使用局部变量,那么它是线程安全的。”-这是一种误导性的说法。如果您的局部变量和其他线程的局部变量引用同一个对象,并且您都在同时对其调用线程不安全的方法,那么您的代码就不是线程安全的。@MichaelAnderson-hmmm。这是正确的。我在回答中已经澄清了。基本上,如果实例是局部的,它就不安全了如果方法是threadsafe@user2357112请参见编辑以回答“局部变量”不能引用与其他线程相同的对象-它们是在方法中创建的。您应该注意,
String
的不变性对于这里的线程安全至关重要。@ruakh我所有的变量都是局部变量。它们都是零。我稍微更改了措辞以允许零,但认真地说,我们只是在这里玩语义游戏。ans就我而言,wer是“正确的”。它不是一个复杂的概念——它不需要太多复杂的解释。
public static int countWords(String str) {
    return str.trim().split("\\s+").length;
}