[英]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
线程安全。 可以同时通过多个StringTokenizer
或string.substring
进行访问,而不会出现任何问题。
但是,问题可能来自类StringTokenizer
,您不应同时在多个字符串上使用。 但是,正如其他人指出的那样,在您的代码中您仅使用局部变量,因此不会出现线程安全问题。
根据Javadoc:“ StringTokenizer对象在内部维护要标记的字符串中的当前位置。某些操作使此当前位置前进到经过处理的字符之外。”
因此它不是线程安全的。 您为什么仍要共享它? 只需将其设置为局部变量即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.