могу я попросить объяснить мне, как потоки и синхронизация работают в Java?
Я хочу написать высокопроизводительное приложение. Внутри этого приложения я читаю данные из файлов в некоторые вложенные классы, которые в основном представляют собой ореховую скорлупу вокруг HashMap.
После завершения чтения данных я запускаю потоки, которым необходимо просмотреть данные и выполнить различные проверки. Однако потоки никогда не изменяют данные!
Если я могу гарантировать (или хотя бы попытаться гарантировать), что мои потоки никогда не изменяют данные, могу ли я использовать их для вызова несинхронизированных методов объектов, содержащих данные?
Если несколько потоков обращаются к несинхронизированному методу, который не изменяет никаких полей класса, но имеет некоторые внутренние переменные, безопасно ли это?
искусственный пример:
public class Data{
// this hash map is filled before I start threads
protected Map<Integer, Spike> allSpikes = new HashMap<Integer, Spike>();
public HashMap returnBigSpikes(){
Map<Integer, Spike> bigSpikes = new HashMap<Integer, Spike>();
for (Integer i: allSpikes.keySet()){
if (allSpikes.get(i).spikeSize > 100){
bigSpikes.put(i,allSpikes.get(i));
}
}
return bigSpikes;
}
}
Безопасно ли вызывать несинхронизированный метод returnBigSpikes() из потоков?
Теперь я понимаю, что такие варианты использования потенциально очень опасны, потому что трудно контролировать, что данные (например, возвращенные bigSpikes) не будут изменены. Но я уже реализовал и протестировал его таким образом и хочу знать, могу ли я использовать результаты своего приложения сейчас и изменить архитектуру позже...
Что произойдет, если я сделаю методы синхронизированными? Будет ли приложение замедлено до 1 производительности процессора? Если да, то как я могу правильно его спроектировать и сохранить производительность?
(Я читаю около 20-40 Гб данных (сообщения журнала) в основную память, а затем запускаю потоки, которым нужно просмотреть все данные, чтобы найти в них какую-то корреляцию; каждый поток становится только частью сообщений для анализа; но для анализа поток должен сравнивать каждое сообщение от своей части с множеством других сообщений от данных, поэтому я сначала решил разрешить потокам читать данные без синхронизации).
Заранее большое спасибо.
returnBigSpikes
обращаются несколько потоков одновременно? - person Vishal K   schedule 21.03.2013