【问题标题】:Parameters in static methods of java are thread safe?java的静态方法中的参数是线程安全的吗?
【发布时间】:2018-10-23 16:44:50
【问题描述】:

我在 java JSP / Servlet 中有一个 Web 应用程序

我的查询是:

如果我有一个util方法如下

public static String doUtil(String param) {

    //Some processing on param.........

    String result = someProcess(param);

    return result;

}

查询是否在 Servlet Class.method(param) 中访问此方法,对于来自互联网上不同客户端的多个请求是否是线程安全的?

【问题讨论】:

  • Java 不是 Javascript。请努力找出您要学习的语言的名称。
  • 不幸的是,没有足够的信息来确定您正在做的事情是否是线程安全的。例如,如果someProcess(param) 使用并更改了某些全局状态,则它可能不是线程安全的。
  • 不要问个别方法的线程安全。重要的是他们操作的数据。线程安全的中心思想是防止线程 B、C 和 D 在线程 A 正在更新它的过程中看到一些处于临时、不一致/无效状态的数据集合。您的示例中唯一可见的数据是单个 String 对象。 Java 中的字符串是不可变的——任何线程都不可能更新字符串——因此,如果您只担心该字符串的内部一致性,那么它会自动成为线程安全的。

标签: java multithreading methods static


【解决方案1】:

只要不将参数值存储在 servlet 的状态中,就不必担心参数的线程安全性。当参数作为参数从一个方法传递到另一个方法并且不以共享状态存储时,它们是安全的。

另外,您的参数是String 类型。字符串类型是不可变的,因此是线程安全的。

上述方法适用于静态方法和实例方法。

【讨论】:

    【解决方案2】:

    是的。但只是因为你传递了不可变的字符串。静态方法只有在修改某些全局状态时才是危险的。在 Google 上搜索:“没有副作用的功能”

    【讨论】:

      【解决方案3】:

      根据您给出的示例,它似乎是一个纯静态函数。

      如果一个函数对于相同的参数值总是返回相同的结果并且它没有修改参数(或全局变量)或输出某些东西等副作用,则称为纯函数。调用纯函数的唯一结果是返回值。纯函数的例子有 strlen()、pow()、sqrt() 等。

      https://www.geeksforgeeks.org/pure-functions/

      所以这里没有使用全局变量,所以不会有线程安全的情况。

      【讨论】:

      • 如果没有看到整个实现(包括它调用的someProcess(...)函数的实现),你不能知道示例中的doUtil(...)函数是纯函数。如果“process”是一个apt 名称,那么我会怀疑 someProcess() 会更改程序的静态全局状态。
      【解决方案4】:

      只要函数的内容是线程安全的,它就是线程安全的。例如。如果它是纯函数(仅适用于输入数据),它将是线程安全的。如果使用另一个非线程安全的静态函数,那么它也不是线程安全的。

      【讨论】:

        猜你喜欢
        • 2013-06-19
        • 2013-09-04
        • 2014-03-28
        • 1970-01-01
        • 2016-07-16
        • 2018-01-17
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多