Любые ошибки, использующие статические внутренние классы в многопоточной среде? - PullRequest
1 голос
/ 16 декабря 2010

Это мой первый набег в многопоточную среду, и в настоящее время я внедряю решение с использованием библиотеки параллелизма Java.Код, по сути, принимает ряд запросов на обслуживание, отправляет все запросы асинхронно и возвращает карту ответов, когда все службы завершены.Мой код выглядит примерно так:

public OuterClass {

  public IResponseMap sendAsynchronousRequests(IRequest... dataList) {
    List<RepositoryFutureTask<IRequest>> futures = new ArrayList<RepositoryFutureTask<IRequest>>();

    //create one future for each request in the list
    for (final IRequest request : dataList) {
        RepositoryFutureTask<IRequest> future = new RepositoryFutureTask<IRequest>(request.getId(), new Callable<IRequest>() {
            public IResponse call() {
                return request.getService().callService(request.getRequestData());
            }
        });
        futures.add(future);
    }

   //Submit each future for execution
   for(Future future:futures) {
      //Singleton ReqeustExecutorService maintains a pool of threads via
      // java.util.concurrent.ExecutorService
      RequestExecutorService.execute(future);
   }

   //Block processing until all requests have finished and add responses to map
   //based on id as they finish
   IResponseMap responseMap = new ResponseMap();
   for(RepositoryFutureTask future:futures) {
      responseMap.put(future.getId(), future.get());
   }


    return responseMap;
  }

static class RepositoryFutureTask extends FutureTask<IResponse> {
     private String id;

    public RepositoryFutureTask(String theId, Callable<IResponse> callable) {
        super(callable);
          id = theId;
    }
    //standard getter for id omitted for conciseness
}
}

Меня в первую очередь интересует, будет ли мое статическое решение внутреннего класса создавать какие-либо проблемы в многопоточной среде, но также будут интересоваться любыми другими комментариями по вышеупомянутому решению,Обратите внимание, что есть вероятность, что приведенный выше код не идеален, поскольку он все еще несколько псевдокод, и я его много обобщил.Обработка ошибок также была удалена.Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Если у вас есть статический метод synchronized в статическом вложенном классе, это будет блокировка для объекта, отличного от того же во внешнем классе. Я бы порекомендовал модификатор synchronized для любого метода, особенно для статического.

Больше проблем с анонимными внутренними классами, блокировки на this будут другими. Даже если вы напишите synchronized (this) {, это не так очевидно. Я видел это несколько раз.

Теоретически, я думаю, вы могли бы столкнуться с проблемами, если бы статический инициализатор вложенного класса работал параллельно статическому инициализатору внешнего класса nester. Технически это то же самое, что и запуск статических инициализаторов в двух внешних классах, но у вас больше шансов иметь циклические зависимости с вложенными классами.

3 голосов
/ 16 декабря 2010

Нет, статические внутренние классы загружаются способом, эквивалентным классам верхнего уровня. См. 8.5.2 JLS - http://java.sun.com/docs/books/jls/third_edition/html/classes.html

1 голос
/ 17 декабря 2010

Нет проблем с использованием статического внутреннего класса. Единственная проблема заключается в том, что private String id; не является final. Сделайте это final, и вы будете в порядке с безопасностью потока; -)

...