相关疑难解决方法(0)

Java数组在静态方法线程中是否安全?

   public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // Key is in a[lo..hi] or not present.
            int mid = lo + (hi - lo) / 2;
            if      (key < a[mid]) hi = mid - 1;
            else if (key > a[mid]) lo = mid + 1;
            else return mid;
        }
        return -1;
    }
Run Code Online (Sandbox Code Playgroud)

上面的静态方法进行二分查找.它是线程安全的吗?我知道局部变量是线程安全的,但"a"这里是一个数组,所以这意味着它是Java中的一个对象,对吧?那是问题吗?刚刚读取数组,没有以任何方式进行修改,所以我假设这个方法是线程安全的.但我想确保理解为什么.

谢谢!

java static-methods thread-safety

8
推荐指数
1
解决办法
3643
查看次数

Java:是否需要同步所有静态方法?

我有一个朋友说所有静态方法都应该synchronized在Java Web应用程序的上下文中.真的吗?我已经阅读了很多关于此的堆栈溢出页面.我所相信的是,如果你有以下情况,你只需要同步:

  1. 多个线程(如在带有线程池的Sevlet容器中)
  2. 单个ClassLoader
  3. 线程之间的共享数据,无论是会话数据还是静态成员数据.
  4. 共享数据必须是可变的.只读数据可以共享.

基于此,我认为静态成员应该是同步的,而不是静态方法.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest {

    static String staticString = "";

    // This static method is safe b/c it only uses local data.
    // It does not use any shared mutable data.
    // It even uses a string builder.
    static String safeStaticMethod(String in) {
        // This also proves that StringBuilder is safe
        // When used locally by a thread.
        StringBuilder sb = new StringBuilder();
        sb.append("Hello: ");
        sb.append(in); …
Run Code Online (Sandbox Code Playgroud)

java synchronization servlets thread-safety

7
推荐指数
1
解决办法
4252
查看次数

通过Java静态方法编写log4j2日志时包含ThreadContext - 它是否是线程安全的?

在Web服务应用程序中,我使用静态方法设置log4j ThreadContext变量以进行日志记录,如下所示,

public static void setLogParams(String company_id, String userId) {
    ThreadContext.put("company_id_val", company_id);
    ThreadContext.put("user_id_val", userId);
}
Run Code Online (Sandbox Code Playgroud)

每个Web服务请求最初都会调用上面的方法,然后loj4j Logger object用于完成剩下的工作.以上给定值每次都不相同,可能会改变请求请求.

我的问题:上面的场景是线程安全的吗?不同的Web服务请求是否共享相同的内容company_id,user_id因为这两个参数都保持相同的引用?那会很混乱.我应该使用非静态方法吗?

我确实经历了下面的类似问题

如果非同步静态方法不修改静态类变量,那么它们是否安全?

但我需要澄清一下.

java concurrency web-services log4j thread-safety

2
推荐指数
1
解决办法
3250
查看次数