"Здравей, Амиго! Вчера обсъждахме предимствата и удобствата на многопоточността. Сега е време да разгледаме недостатъците. А те, за съжаление, не са малко."
Преди това разглеждахме програмата като набор от обекти, които извикват взаимно методи. Сега всичко става малко по-сложно. Програмата е по-скоро набор от обекти, който има няколко "малки робота" (нишки), които пълзят през него и изпълняват командите, съдържащи се в методите.
Това ново тълкуване не отменя първото. Те все още са обекти и все още си извикват методи. Но трябва да помним, че има няколко нишки и всяка нишка върши своя собствена работа or задача.
Програмата става все по-сложна. Различните нишки променят състоянието на различни обекти въз основа на задачите, които изпълняват. И могат да си стъпват на пръстите.
Но най-лошите неща се случват дълбоко в Java машината. Както вече казах, привидната едновременност на нишките се постига от факта, че процесорът постоянно превключва от една нишка към друга. Превключва към нишка, работи 10 мorсекунди, превключва към следващата нишка, работи 10 мorсекунди и т.н. И тук е проблемът: тези превключвания могат да се появят в най-неподходящите моменти. Помислете за този пример:
Код на първата нишка | Код на втората нишка |
---|---|
|
|
Това, което очаквахме да бъде показано |
---|
Ник е на 15 години, Лена е на 21 години |
Действително изпълнение на codeа | Код на първата нишка | Код на втората нишка |
---|---|---|
|
|
|
Какво всъщност се показва |
---|
Ник е Лена е на 15 21 години |
И ето още един пример:
Код | Описание |
---|---|
|
Методът за размяна swap на стойностите на променливите name1 и name2 .
Какво може да се случи, ако бъде извикан от две нишки едновременно? |
Действително изпълнение на codeа | Код на първата нишка | Код на втората нишка |
---|---|---|
|
|
|
Долния ред |
---|
И двете променливи имат стойността «Лена». Обектът «Съюзник» не успя. Загубено е. |
"Кой би предположил, че грешки като тази са възможни с такава проста операция за присвояване?!"
"Да, този проблем има решение. Но ще поговорим за това малко по-късно - гърлото ми е пресъхнало."
GO TO FULL VERSION