此代码线程是否安全?
创建runnable并通过反射调用方法:
public class A {
public static void someMethod (List<VO> voList){
int endIndex=0;
for (int firstIndex = 0; firstIndex < voList.size(); ) {
endIndex = Math.min(firstIndex + threadSize, voList.size());
Runner runner = null;
try {
runner = new Runner(voList.subList(firstIndex, endIndex),
B.class.getMethod("createSomeString", D.class));
} catch (NoSuchMethodException ex) {
log.warn(ex.getMessage());
}
//start a thread
runner.start();
}
}
private static class Runner extends Thread {
private Method method;
private List<C> list;
public Runner(Method method,List<C> clist) {
this.method = method;
this.list=clist;
}
}
public void run() {
for (C vo: list) {
String xml = (String) method.invoke(null,vo);
}
}
}
我想通过反射调用静态方法,这个代码块线程是否安全?
public class B {
public static String createSomeString(D a) throws Exception {
return a.name;
}
}
和D.class是这样的普通老java对象类:
public class D implements Serializable{
private String name;
}
答案 0 :(得分:0)
如果您在方法中使用静态变量,或者需要线程安全的任何其他内容,synchronized
关键字是一个选项。
public class B {
public synchronized String createSomeString(A a) throws Exception {
return a.name;
}
}
另一种选择是使用池大小为1的队列。 Google提供了一个很好的示例项目:Running Code on a Thread Pool Thread
如果多个线程可以访问a.name
,那么您将需要同步它。
public class B {
public static String createSomeString(A a) throws Exception {
String strName = "";
synchronize (a.name) {
strName = new String(a.name);
}
return strName;
}
}
答案 1 :(得分:-2)
您只在静态方法中执行读操作,因此无论您的程序有多少并发,它都是线程安全的。如果涉及读取和写入,则必须同步静态方法或代码块。
答案 2 :(得分:-3)