通过反射调用静态方法在java中是否是线程安全的?

时间:2013-09-08 11:35:01

标签: java multithreading reflection thread-safety

此代码线程是否安全?

创建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;
   }

3 个答案:

答案 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)