Използване на синхронизирани - 1

„Здрасти, Амиго!“

— Да, тук съм, тук съм.

„Днес ще ви разкажа за използването на synchronized на практика.“

„Когато една програма има много обекти и нишки, често се случва множество нишки да работят с един и същ обект едновременно. При това нишките си пречат една на друга.“

— Да, вече знам това.

"Така че, да кажем, че имате обект, достъпен от множество нишки. Можете да направите две неща, за да избегнете проблеми."

„Първият е да се използват синхронизирани блокове за обвиване на всяко място, където има достъп до обекта. Но този подход може да не работи, ако някой програмист напише code, който осъществява директен достъп до обекта, без синхронизиран блок.“

„Следователно през повечето време се използва втори подход – пequalsе на обекта безопасен за нишки.“ „С други думи, синхронизираният механизъм е вграден в самия обект: той декларира своите методи за синхронизирани и/or обвива codeа в своите методи в синхронизирани блокове.“

„Значи всеки обект, който мога да използвам от множество нишки, и това са почти всички обекти в програмата, трябва да направя безопасен за нишки?“

„Като цяло, да. В действителност не всички обекти в една програма се използват от различни нишки, но обикновено има много. Така че, когато започнете да пишете code за нишка и имате достъп до различни обекти от нея, тогава с всяко извикване на метод трябва да се запитате: «Безопасно ли е това обаждане?»

— В безопасност?

„Сигурно за нишки, което означава, че може безопасно да се извиква от множество нишки.“

"Ето няколко примера. Да предположим, че имате String обект, който е достъпен от различни нишки. Както вече трябваше да запомните, String е неизменен - ​​Howто и всички други примитивни типове. Това означава, че обектът не се променя след като е създаден . Това означава, че е невъзможно да се «счупи» такъв обект. Всички неизменни обекти са безопасни за нишки.

— Е, това улеснява нещата.

„А сега да предположим, че имате нужда от променлив низ.“

"Да, помня. Има два вида такива низове: StringBuffer и StringBuilder. StringBuffer е като StringBuilder, но всичките му методи са синхронизирани. Също така ли е безопасен за нишки?"

"Да. Ако имате нужда от достъп до StringBuilder обект от множество нишки, трябва да го замените с StringBuffer. В противен случай, рано or късно нишките ще го променят едновременно и ще го "счупят"."

"Ами ако обектът, до който се осъществява достъп от различни нишки, е обект от моя собствен клас? Трябва ли да добавя синхронизирани към неговите методи и в този случай?"

"Да. Най-добре е да следвате това правило: всички обекти, които ще бъдат достъпни от различни нишки, трябва да са безопасни за нишки."

— Разбирам. Не мислех, че всичко е толкова сериозно. Благодаря, Ели.

„Няма на Howво. Надявам се, че тези съвети ще ви помогнат, когато Диего ви даде някои от неговите лесни задачи. ☺“