Один вопрос о параллельном выполнении в Java

Рейтинг: 1Ответов: 1Опубликовано: 25.03.2015

Допустим, есть. Метод выполняется в нескольких потоках.

 private void removeNetworkFromSimulation(final SimulationSessionAgents session, final SimulationBaseEntity baseEntity) {
        for (final MobileCoreAgent mcAgent : session.getCoreAgents().values())
            session.requestAction(mcAgent.getCoreId(), new CrossThreadRunnable() {
                        @Override
                        public void run() {
                            Collection<ConnectivityLink> links = ((EpcVsVepcModel) session.getSimulationModel()).getLinks();
                            CoreSimulator.requestLinksRemoval(CommonUtils.getInLinks(baseEntity, links), mcAgent);
                            CoreSimulator.requestLinksRemoval(CommonUtils.getOutLinks(baseEntity, links), mcAgent);
                            mcAgent.getCoreSimulator().removeAgent(baseEntity.getNcID());
                        }
                    }
            );

    }

Будет ли он потокобезопасным?

Вот эта строка:

session.requestAction(mcAgent.getCoreId(), new CrossThreadRunnable() {

Означает, что в одном потоке, в очереди будет выполнен код run() безымянного класса CrossThreadRunnable.

Ответы

▲ 1Принят

В пакете concurrent есть замечательный класс ReentrantLock, используй его дабы обезопасить выполнение своего кода. Блокируй поток на выполнении перед вызовом метода и снимай блокировку после выполнения.

private static final ReentrantLock rl = new ReentantLock();

....

try{
rl.lock();
...
} finally{
 rl.unlock();
}