0

这个代码线程安全吗?

创建可运行并通过反射调用方法:

 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;
   }
4

3 回答 3

0

如果您在方法中使用静态变量,或者任何其他需要线程安全的东西,那么synchronized关键字是一种选择。

   public class B {
       public synchronized String createSomeString(A a) throws Exception {
         return a.name;
       }
   }

另一种选择是使用池大小为 1 的队列。谷歌有一个很好的示例项目可用于:在线程池线程上运行代码

如果它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;
       }
   }
于 2013-09-08T12:06:32.513 回答
-2

您只在静态方法中执行读取操作,因此无论您的程序有多少并发,它都是线程安全的。如果同时涉及读取和写入,那么您必须同步您的静态方法或代码块。

于 2013-09-08T13:12:34.640 回答
-3

使用挥发物。请点击这里了解 http://javarevisited.blogspot.in/2011/06/volatile-keyword-java-example-tutorial.html

于 2013-09-08T16:18:39.110 回答