Синхронизација у Јави: Шта, како и зашто?



Овај чланак о синхронизацији на Јави помоћи ће вам да се упознате са синхронизацијом програма са више нити.

Програми са више нити могу се редовно појављивати у околностима када су вишеструки покушај да се дође до истог ресурса који даје лажне и запањујуће резултате. То се може решити коришћењем синхронизације у Јави. Само једна одређена нит може доћи до ресурса у одређену сврху. Овај чланак ће вам помоћи да се упознате са стратегијом синхронизације.

О темама ћу разговарати овим редоследом:





Хајде да почнемо!

Зашто користити синхронизацију у Јави?



Ако започнете са најмање две нити унутар програма, можда постоји шанса када више нити покуша да дође до истог ресурса. То чак може створити неочекивани исход због проблема са паралелношћу.

Синтакса :

синхронизовано (објецтидентифиер) {// Приступ дељеним променљивим и другим дељеним ресурсима}

На пример, покушај писања у еквивалентној датотеци. То може оштетити податке јер једна од нити може надјачати податке или када нит отвараисту датотеку истовремено, друга нит можда затвара исту датотеку.Потребно је синхронизовати деловање више нити. Ово се може применити помоћу концепта тзв М. ониори .



  • Свака је повезан са монитором, који нит може да закључа или откључа.
  • Само једна нит истовремено може држати браву на монитору.
  • Јава Програмски језик пружа врло практичан начин стварања нити и синхронизације њихових задатака помоћу Синхронизовано блокови.
  • Такође задржава заједничке ресурсе у овом одређеном блоку.

Синхронизовани блокови у Јави су означени знаком Синхронизовано кључна реч. Овај блок у Јави је синхронизован на неком објекту.Сви блокови који су синхронизовани на истом објекту могу истовремено имати само једну нит која се извршава у њима. Све остале нити које покушавају да уђу у синхронизовани блок су блокиране све док нит унутар синхронизованог блока не изађе из блока.

Врсте синхронизације

У основи постоје две врсте синхронизације. Су:

  1. Синхронизација процеса: Истовремено извршавање више нити или процеса да би се постигло такво стање да се они обаве у одређеном редоследу радњи.
  2. Синхронизација нити: У тренуцима када више нитипокушава да приступи дељеном ресурсу, морате осигурати да ресурс користи само једна нит навреме.

Не улазимо у детаље ових врста и покушајмо да разумемо шта су браве .

Браве у Јави

Као што сам раније споменуо, Синхронизација се гради око унутрашњег ентитета познатог као закључати или монитор . Уз сваки предмет је повезана брава. Дакле, нит којој је потребан доследан приступ пољима објекта мора да преузме браву објекта пре него што им приступи, а затим отпусти браву када је посао завршен.

Из Јаве 5, пакет јава.утил.цонцуррент.лоцкс садржи многе имплементације закључавања.

Овако изгледа брава:

закључавање јавне класе {привате боолеан исЛоцкед = лажно јавно синхронизовано воид лоцк () баца ИнтерруптедЕкцептион {вхиле (исЛоцкед) {ваит ()} исЛоцкед = труе} јавно синхронизовано воид унлоцк () {исЛоцкед = фалсе нотифи ()}}

Метода лоцк () закључава инстанцу Лоцк тако да су све нити које позивају лоцк () блокиране док се не изврши унлоцк ().

Вишеструки навој без синхронизације

Ево једноставног примера који исписује вредност бројача у низу и сваки пут када га покренемо, он даје другачији резултат на основу доступности процесора у нити. Види ово!

класа Мултитхреад {публиц воид принтЦоунт () {три {фор (инт и = 5 и<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Резултати горе наведеног програма у овом:

разлика између лутке и кувара

Излаз- Синхронизација у Јава- Едурека

Вишеструки навој са синхронизацијом

Ово је исти пример као горе, али исписује вредност бројача у низу. Сваки пут кад га покренемо, он даје исти резултат.

класа Мултитхреад {публиц воид принтЦоунт () {три {фор (инт и = 5 и> 0 и--) {Систем.оут.принтлн ('Цоунтер ---' + и)}} цатцх (Изузетак е) {Систем. оут.принтлн ('Нит прекинут.')}}} класа Нит се протеже Мултитхреад {привате Тхреад т привате Стринг тхреадНаме Мултитхреад МТ Тхреад (Стринг наме, Мултитхреад мт) {тхреадНаме = наме МТ = мт} публиц воид рун () {синцхронизед ( МТ) {МТ.принтЦоунт ()} Систем.оут.принтлн ('Тхреад' + тхреадНаме + 'екитинг.')} Публиц воид старт () {Систем.оут.принтлн ('Стартинг' + тхреадНаме) иф (т == нулл) {т = нев Тхреад (тхис, тхреадНаме) т.старт ()}}} јавна класа ТестТхреад {публиц статиц воид маин (Стринг аргс []) {Мултитхреад МТ = нев Мултитхреад () Тхреад Т = нев Тхреад ('Тхреад - 1 ', МТ) Треад Т1 = нев Тхреад (' Тхреад - 2 ', МТ) Т.старт () Т1.старт () // сачекајте да се теме заврше покушајте {Т.јоин () Т1.јоин ()} цатцх (Екцептион е) {Систем.оут.принтлн ('Интерруптед')}}}

Излаз је приказан испод:

Синхронизована кључна реч

синхронизована кључна реч означава блок или методу критичним одељком. Критични одељак је тамо где се истовремено извршава само једна нит, а нит држи браву за синхронизовани одељак. Ово синхронизовано кључна реч помаже у писању истовремено делове било које апликације. Такође штити заједничке ресурсе унутар блока.

Синхронизована кључна реч може се користити са:

Разговарајмо о блоку кода.

Синхронизована кључна реч: блок кода

Синтакса

Општа синтакса за писање синхронизованог блока је:

синхронизовано (лоцкОбјецт) {// синхронизоване изјаве}

Када нит жели да изврши синхронизоване изразе унутар блока, мора да добије закључавање на монитору лоцкОбјецт-а. Само једна нит може истовремено да добије монитор закључаног објекта. Дакле, све остале нити морају сачекати док тренутна извршавајућа нит стекне браву и завршити своје извршавање.
Овим путем, синхронизовано кључна реч гарантује да ће само једна нит извршавати синхронизоване изјаве блока истовремено и на тај начин спречава више нити да оштете дељене податке који су присутни унутар блока.

Белешка :

  • Ако се нит постави у стање спавања (помоћу спавање () метода) тада не отпушта браву. Током овог времена мировања, ниједна нит неће извршавати синхронизоване наредбе блокова.
  • Јава синхронизација ће бацити НуллПоинтерЕкцептион ако се објект закључавања користи у „ синхронизовано (закључавање) ‘Је ништавно.

Сада, разговарајмо о методи.

Синхронизована кључна реч: Метод

Синтакса

Општа синтакса за писање а синхронизовани метод је:

синхронизовани метод (параметри) {// синхронизовани код}

Ево лоцкОбјецт је само референца на објекат чија је брава повезана са монитором који представља синхронизоване изразе.

Слично синхронизованом блоку, нит мора синхронизованом методом стећи закључавање на повезаном објекту монитора. У случају синхронизоване методе, објект закључавања је:

  • Објект „.класе“ - ако је дата метода статички .
  • „Овај“ објекат - ако је метода нестатичан . „Ово“ је референца на тренутни објекат у којем се позива синхронизована метода.

Јава синхронизована кључна реч је ре-ентрант у природи. То значи да ако синхронизована метода позове другу синхронизовану методу која захтева исту браву, тада тренутна нит која држи браву може да уђе у ту методу без добијања браве.

Пређимо на последњу тему овог чланка и укажемо на главне разлике између синхронизоване кључне речи и синхронизационог блока.

Разлика између синхронизоване кључне речи и синхронизованог блока

  • Када користите синхронизовану кључну реч са метода , стиче закључавање у објекту за целу методу. То значи да ниједна друга нит не може користити било који синхронизовани метод док тренутна нит која се позива не заврши своје извршавање.
  • Синхронизовано блокирати стиче закључавање у објекту само између заграда након што је наведена синхронизована кључна реч. То значи да ниједна друга нит не може закључати већ закључани објекат док блок не изађе. Али друге нити ће моћи да приступе остатку кода који је присутан у методи.

Ово нас доводи до краја овог чланка где смо разговарали о томе како тачно функционише Синхронизација у Јави. Надам се да вам је јасно све што је са вама подељено у овом упутству.

Погледајте Едурека, поуздана компанија за учење на мрежи са мрежом од више од 250.000 задовољних ученика раширених широм света. Овде смо да вам помогнемо у сваком кораку на вашем путовању, јер поред тога што постављате питања о јава интервјуу, осмислили смо наставни план и програм који је дизајниран за студенте и професионалце који желе да буду Јава програмери.

Имате питање за нас? Молимо вас да га поменете у одељку за коментаре овог „Синхронизације у Јави ' чланак и јавићемо вам се у најкраћем могућем року.