2

我创建了一个 StringUtil 类,用于在整个应用程序中进行一些字符串验证。StringUtil 的代码如下,

public class StringUtil {
    public static synchronized boolean isValidString(String string) {
        return string!= null && string.trim().length() > 0;
    }

}

在此类中,该方法检查字符串是否为有效字符串。此方法是线程安全的。在企业应用程序中,可能有多个线程访问此方法。如果一个线程正在访问这个方法,那么所有其他线程都必须等待轮到它。反过来,此方法将非常频繁地用于检查字符串中的空值。那么哪个是最好的选择

  1. 使其成为单例和线程安全
  2. 将此作为实例方法
  3. 有没有其他方法可以用这种类型的对象组织一个池,每个线程都会拿起一个并在完成后将对象释放到池中。所以线程安全不是问题,对象创建也没有完成。
  4. 是否有任何相同的开源库。
4

7 回答 7

16

由于您在这里没有任何状态(您只使用方法参数string),因此该方法本质上是线程安全的。因此没有必要使用synchronized关键字。

如果在整个项目中都使用该方法,那么最好static按照您已经完成的方式声明它。

于 2012-09-14T08:28:59.800 回答
7

通常像这样的辅助方法是public static,而不是synchronized,因为类不保持状态。由于它也不保持状态,因此您不需要池。

我认为 apache commons StringUtils类就是一个很好的例子。

我有一种感觉,您正在尝试使用中子炮打开核桃,简单为王:)

于 2012-09-14T08:31:36.203 回答
3

您可以尝试 Apache Commons 的 util 类。

但是无论如何你在这里都有线程安全,因为你没有在类中操作其他调用可能读取的任何东西(即你没有状态)。

于 2012-09-14T08:30:52.293 回答
3

您可能应该使用StringUtilsApache Commons 中的类。

于 2012-09-14T08:32:10.797 回答
1

此方法不应同步,因为它不使用任何类级变量。所以多个线程可以毫无问题地同时访问它。

此外,当您为运行到容器中的企业应用程序编写代码时,请忘记同步。关心线程安全是容器的责任。synchronized块只是打扰容器完成它的工作。如果您需要在企业应用程序中进行同步,请重新考虑您的设计和/或找到其他模式(有很多)来解决您的问题。

于 2012-09-14T08:31:59.537 回答
1

不需要synchronized关键字,因为 String 是不可变对象

Immutable objects are often useful because they are inherently thread-safe

public static boolean isValidString(String string) {
    return !(string== null || string.isEmpty()); //Since 1.6
}
于 2012-09-14T09:03:10.340 回答
1

实用程序类通常只包含静态方法,因此明确声明这些类不是为实例化而设计的总是一个好主意。因此将它们的构造函数设为私有:

public class StringUtils {

  private StringUtils() {
    throw new AssertionError("shouldn't be instantiated");
  }

}

(请参阅Joshua Bloch圣经:第 4 项:使用私有构造函数强制执行不可实例化)

于 2012-09-14T09:14:53.843 回答