мога ли да помоля да ми обясните как работят нишките и синхронизацията в 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 CPU? Ако е така, как мога да го проектирам правилно и да запазя производителността?
(Прочетох около 20-40 Gb данни (регистрационни съобщения) в основната памет и след това стартирам нишки, които трябва да преминат през всички данни, за да намерят някаква корелация в тях; всяка нишка става само част от съобщения за анализ; но за анализа нишката трябва да сравнява всяко съобщение от своята част с много други съобщения от данни; затова първо реших да разреша на нишките да четат данни без синхронизация).
Благодаря много предварително.
returnBigSpikes
от множество нишки наведнъж? - person Vishal K   schedule 21.03.2013