Являются ли общие бины между прототипными бобами безопасными? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть prototype bean, который я использую в многопоточном приложении. Я использую ThreadPoolExecutionService для запуска различных экземпляров prototype.

Я хочу собрать некоторую статистику по коду, выполняемому потоками, включая создание нескольких переменных и их приращение по мере запуска прототипов.

Я думал о создании компонента singleton, внедрении компонента в prototype и вызове метода для установки статистики.

Несколько фиктивных кодов, чтобы проиллюстрировать это: кредит на mykong за фиктивный код, который я немного изменил.

public static void main( String[] args )
{

    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

    PrintThread printThread1 = (PrintThread) ctx.getBean("printThread");
    printThread1.setName("Thread 1");

    PrintThread printThread2 = (PrintThread) ctx.getBean("printThread");
    printThread2.setName("Thread 2");

    PrintThread printThread3 = (PrintThread) ctx.getBean("printThread");
    printThread3.setName("Thread 3");

    PrintThread printThread4 = (PrintThread) ctx.getBean("printThread");
    printThread4.setName("Thread 4");

    PrintThread printThread5 = (PrintThread) ctx.getBean("printThread");
    printThread5.setName("Thread 5");

    printThread1.start();
    printThread2.start();
    printThread3.start();
    printThread4.start();
    printThread5.start();

}

ПечатьThread, с впрыском:

@Component
@Scope("prototype")
public class PrintThread extends Thread{

@Inject
private StatGatherer statGatherer;

@Override
public void run() {

    System.out.println(getName() + " is running");

    //is this threadsafe?   
    statGatherer.writeSomeStat(); 

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(getName() + " is running");
}

}

Редактировать: Пример класса безопасности потока. Код содержит три карты, которые можно увеличивать с помощью синхронизированных методов.

@Component("statistics")
public class StatGathererImpl implements StatGatherer {

private ConcurrentHashMap<Character, Integer> mappingType = new ConcurrentHashMap<>();
private ConcurrentHashMap<Character, Integer> mappingGroup = new ConcurrentHashMap<>();
private ConcurrentHashMap<Character, Integer> mappingDirection = new ConcurrentHashMap<>();

@Override
public synchronized void incrementMappingType(char mapType) {
    if(mappingType.keySet().contains(mapType)){
        mappingType.replace(mapType, mappingType.get(mapType), mappingType.get(mapType)+1);
    }else{
        mappingType.put(mapType, 1);
    }
}

@Override
public synchronized void incrementMappingGroup(char mapGroup) {
    if(mappingGroup.keySet().contains(mapGroup)){
        mappingGroup.replace(mapGroup, mappingGroup.get(mapGroup), mappingGroup.get(mapGroup)+1);
    }else{
        mappingGroup.put(mapGroup, 1);
    }
}

@Override
public synchronized void incrementMappingDirection(char mapDirection) {
    if(mappingDirection.keySet().contains(mapDirection)){
        mappingDirection.replace(mapDirection, mappingDirection.get(mapDirection), mappingDirection.get(mapDirection)+1);
    }else{
        mappingDirection.put(mapDirection, 1);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...