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中的一个对象,对吧?那是问题吗?刚刚读取数组,没有以任何方式进行修改,所以我假设这个方法是线程安全的.但我想确保理解为什么.
谢谢!
我有一个朋友说所有静态方法都应该synchronized在Java Web应用程序的上下文中.真的吗?我已经阅读了很多关于此的堆栈溢出页面.我所相信的是,如果你有以下情况,你只需要同步:
基于此,我认为静态成员应该是同步的,而不是静态方法.
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) 在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因为这两个参数都保持相同的引用?那会很混乱.我应该使用非静态方法吗?
我确实经历了下面的类似问题
但我需要澄清一下.