0

このコードはスレッドセーフですか?

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

3 に答える 3

0

メソッド内で静的変数を使用している場合、またはスレッドセーフにする必要があるその他のものを使用している場合、synchronizedキーワードは 1 つのオプションです。

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

もう 1 つのオプションは、プール サイズが 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;
       }
   }
于 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 に答える