繁体   English   中英

线程安全字符串拆分

[英]Thread Safe String Split

我用StringTokenizer和String的方法indexOf()以及substring()进行了拆分测试。 我必须知道结果之后,第二个要比StringTokenizer快。 但是我的问题是哪个最适合线程安全?

使用StringTokenizer进行字符串拆分:

String sample=null;
StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

if(tokens.hasMoreTokens())
{
    sample= tokens.nextToken();
    System.out.println(sample);
}

使用String方法分割字符串:

String sample= "FF#Mukil";
int pos=sample.indexOf('#');
System.out.println(sample.substring(0,pos));

在这些示例中,样本是全局变量

编辑:在上一个第一个示例如下

StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

    if(tokens.hasMoreTokens())
    {
        String sample= tokens.nextToken();
        System.out.println(sample);
    }

我已如下更改

String sample=null;
StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

    if(tokens.hasMoreTokens())
    {
        sample= tokens.nextToken();
        System.out.println(sample);
    }

编辑:添加了Java文件源。

//FileName=MySplitUtil.java
import javax.servlet.http.HttpServletRequest;
import java.util.StringTokenizer;
public class MySplitUtil
{
    public static void setUsername_locale(HttpServletRequest request)
    {
        String value = (String) request.getAttribute("userLocale"); // userLocale's sample value looks like ffmukil$en_US
        splite1(value,request);
        splite2(value,request);
    }
    private static void splite1(String value,HttpServletRequest request)
    {
        StringTokenizer tokens = new StringTokenizer(value,"$");
        String username=null;
        String locale=null;
        if(tokens.hasMoreTokens())
        {
            username = tokens.nextToken();
            locale = tokens.nextToken();
        }
        request.setAttribute("usrName",username);
        request.setAttribute("usr_Locale",locale);
    }
    private static  void splite2(String value,HttpServletRequest request)
    {
        int pos = value.indexOf('$');
        String username = value.substring(0,pos);
        String locale = value.substring(pos+1,value.length());
        request.setAttribute("usrName",username);
        request.setAttribute("usr_Locale",locale);
    }
}

由于您仅使用局部变量,因此无论使用哪种版本,这两个版本都是绝对安全的...

要遇到线程安全问题,您需要(不正确地)跨线程共享某些内容。 您的示例中没有任何内容可以共享。

更一般而言,字符串是不可变的,因此是线程安全的。 因此,假设sample变量是共享的,第二个版本将是线程安全的。

编辑

您的最新修改确认了两件事:

  • 您的类是无状态的(没有实例变量)
  • 你只使用局部变量

因此,这两种方法都是线程安全的,您应该选择更简单和/或更有效的方法。

在Java中, Strings是不可变的,不会影响原始字符串。

这种不变性使Strings线程安全。 可以同时通过多个StringTokenizerstring.substring进行访问,而不会出现任何问题。

但是,问题可能来自类StringTokenizer ,您不应同时在多个字符串上使用。 但是,正如其他人指出的那样,在您的代码中您仅使用局部变量,因此不会出现线程安全问题。

根据Javadoc:“ StringTokenizer对象在内部维护要标记的字符串中的当前位置。某些操作使此当前位置前进到经过处理的字符之外。”

因此它不是线程安全的。 您为什么仍要共享它? 只需将其设置为局部变量即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM