Отговорите на въпросите за level27 на интервю

Отговорите на въпросите за интервюто Level27

1. Какво е безизходица?
Безизходица - ситуация, в която две или повече нишки са блокирани в очакване на един от друг. Dedlock наричан безизходица.






Застоя - ситуация, в която две или повече процеси, които някои ресурси, опитвайки се да получите някои други ресурси, притежавани от други процеси и никой процес не може да предприеме необходимите средства, и съответно освободят.
Има взаимното фиксиране синхронизиране поръчка (за решен цел);
Заключване между обектите (различни предмети, които се опитват за достъп до същите синхронизирани блока);
Ресурсен застой (при опит за достъп някои от ресурсите, които могат да бъдат използвани в същото време само една нишка).

Метод 5 чакане препоръчва за употреба, ако или докато конструкции?
Отговорът на този въпрос просто цитирам от сайта: www.skipy.ru/technics/synchronization.html
За свикване на чакането. Вече е ясно от оборудването разряд. Препоръчителна да се обадя чакам вътре докато връзка. Т.е. не пишете


Защо е необходимо. Факт е, че причината може да уведоми никого. Само по погрешка, от която никой не е имунизиран. В този случай опитът, за което говорих по-рано, взехме кашата е с цел да се избегне такава възможност. Просто скрит обект, в който се случва синхронизация. И достъп до него е само нашия код. Това е добра практика, но това не винаги е възможно, за съжаление. Така че, ако нишката чака определени условия - докато вариант с по-надеждни. Ако потокът е допуснат по погрешка - той отново проверява състоянието и, ако е необходимо, ще се наложи да изчакате по-нататък.
В допълнение, има възможност и просто излизане от режим на готовност, без да уведоми повикването. Аз честно казано да призная, че не съм виждал това в техническите характеристики на виртуална машина, въпреки че изрично търсите. Но някои "гурута" твърдят, че ВМ може да излезе от спонтанни очаквания. Освен това се наблюдава периодично. Ако някой дава линк към съответната спецификация - аз съм благодарен!

6 Какво се случва след метода на повикване notifyAll?
В java.lang.Object.notifyAll () се събужда всички теми, които чакат на монитор този обект е. Нишка чака на монитор на даден обект, като се обадите един от методите за изчакване.
Тя се събужда всички нишки, които чакат за този монитор.


След инстанциира ImmutablePoint модификация не е възможно.
Най-простият пример на неизменен клас JDK е String. Всеки метод, който ти се обадя по ред (напр description.toLowerCase ()) връщат нов низ, и не променя оригинала.
Пример непостоянен клас от JDK - дата. Например myDate.setHours (х) се променя например myDate!

В случай на многонишковите програмиране предимства на неизменни класове са очевидни: след създаване на обекти може да се предава на други теми, и те винаги ще бъде актуална. Т.е. не е нужно да се провери дали вашата дата не е инстанция на състоянието и дали другата си нишка се променя, докато работите с него. Например, имате метод за законопроект (Дата крайната дата), там сте наивен, за да се провери съответствието на ENDDATE някои предварителни условия и да започнат да работят с него. В този момент, друга тема може да се променя крайната дата, например, го инсталирайте дълбоко в миналото. Последиците могат да бъдат най-невероятни.

8 Какво е «нишка безопасно»?
Отново:
stackoverflow.com/questions/6324085/
безопасна Тема означава, че метод или клас, например, могат да се използват от множество нишки в същото време, без никакви проблеми, настъпили.
Поток държавната сигурност означава, че един метод или клас може да се използва от множество нишки, без да се натъкват на проблеми, т.е. мъртвите зони.
Да разгледаме следния метод:


Сега конец и конеца B както би искал да изпълни AddOne (). но започва първата и чете стойността на Myint (0) в ПТУ. Сега по някаква причина планировчика реши да спре нишка А и отложи изпълнението, за да вденете Б. Тема B сега също чете стойността на Myint (все още 0) в собствен променлива ПТУ. Тема Б завършва целия метод, така че в края на краищата Myint = 1. И 1 се връща. Сега е темата превърне отново. Тема A продължава. И добавя 1 до ПТУ (ПТУ беше 0 за конец A). И след това спестява тази стойност в Myint. Myint отново е 1.
Ето и конец А и Б нишка иска да изпълни AddOne (). Първият но започва Myint и чете стойността (0) в ПТУ. Сега, по някаква причина, разработчикът реши да спре потока от А и Б. постави конец Потокът е сега също чете Myint (0) стойност в собствената си променлива TMP. Тема Б завършва целия метод, така че в края на краищата Myint = 1. И 1 се връща. А поток продължава. Добавя 1 до TMP (ТМР 0 за нишка А). И след това съхранява тази стойност в Myint. Myint 1 отново.






Така че в този случай AddOne на метод се нарича два пъти, но тъй като методът не се реализира по безопасен начин нишка стойността на Myint не е 2, както се очаква, но едно, защото втората нишка прочетете променлива Myint преди завърши първата резба актуализирането му.
Така че в този метод случай AddOne се нарича два пъти, но тъй като този метод не е изпълнен в един поток на сигурно Myint начин стойност не 2, както се очаква, и 1, защото втората нишка четене променлива Myint приключи преди първата нишка да го актуализира.
Създаване на конци безопасни методи е много трудно в които не са тривиални случаи. И има доста техники. В Java може да маркирате метод като синхронизирано, това означава, че само една нишка може да изпълни този метод в даден момент. Останалите нишки чакат в линия. Това прави метод нишка безопасно, но ако има много работа, за да се извърши по начин, то това губи много време. Друга техника е "марка само малка част от метода, синхронизирано" чрез създаване на заключване или семафор и заключване тази малка част (обикновено се нарича критичната част). Има дори някои методи, които се прилагат като lockless конец сейф, което означава, че те са изградени по такъв начин, че множество нишки могат да раса чрез тях в същото време, без изобщо да причиняват проблеми, това може да бъде случаят, когато метод изпълнява само един атомната повикване. Атомни повиквания са повиквания, които не могат да бъдат прекъсвани и може да бъде направено само от една нишка в даден момент.

Създаване на конци - безопасни методи е много трудно. В Java, можете да маркирате метод, както е в синхрон, това би означавало, че само една нишка може да изпълни този метод във всеки даден момент. Други теми, ще чакат на опашката. Това прави метода на конци-безопасно, но ако много работа да се свърши в метода, а след това ще отнеме много време. Друг метод се състои в маркирането само малка част от метода, синхронизирано "чрез създаване на брави (ключалки) или семафор и заключване на малка част (обикновено се нарича критичната точка (критична точка)). Има дори някои методи, които се прилагат като lockless нишка сейф (lockless безопасно резба), това означава, че те са проектирани така, че множество нишки могат да преминат през тях по едно време и никога не представлявала проблем, той може да бъде случаят, когато изпълнява метод само един атомен повикване. Атомни повиквания са повиквания, които не могат да бъдат прекъсвани, и могат да бъдат изпълнени само от една нишка.

ru.wikipedia.org/wiki/.0%9C.0%BE.0%B4.0%B5.0%BB.1%8C_.0%BF.0%B0.0%BC.1%8F.1 % 82,0% B8_Java
По-специално, една изпълнена преди другото за такива сделки (списъкът не е изчерпателен):
• синхронизиране и монитори:
• Монитор Capture (началото на синхронизирани, начина за заключване) и всичко, след като в една и съща нишка.
• Връщане на монитора (в края на синхронизирани, като методът за отключване) и всичко, което пред него в същата нишка.
• По този начин, оптимизатор може да влезе в синхрон блок ред, но не и навън.
• Връщане на монитора и последвалото залавяне на друга тема.
• Писането и четенето:
• Всички зависимости данни (т.е., всяко вписване в променлива и последващото му четенето) в един поток.
• Всичко, което е в същата нишка, преди написването на летливи променлива, а самата записа.
• летливи четат и всичко, след като в една и съща нишка.
• запис на летливи променлива и след това четене е. [4] [2] По този начин, запис енергонезависима памет прави същото, че връщането на монитора, а четенето - същото като залавянето на [5]. Това означава, че ако една нишка се записва в енергонезависима-променлива, а вторият е намерен, всичко, което предхожда Записът се извършва преди всичко, което идва след четенето; см. илюстрация.
• За променливи на обекта (например, летливи Списък х;) такава силна гаранция се извършват за справка на обект, но не и за съдържанието му.
• Поддръжка:
• Статично Инициализация и всяко действие, с който и да е обект, например.
• записване в окончателния-областта в конструктора [6], и всичко след строителя. Като изключение от общото преходните, това се случва, преди връзка не е свързан с преходен други правила, и следователно може да причини раса между резба. [7]
• Всяка работа с предмета и финализира ().
• Обслужване на потока:
• Flow Run всеки код в потока.
• Изчезващата на променливите, свързани с потока, и всеки код в потока.
• в код поток и да се присъединят (); код поток и isAlive () == невярно.
• прекъсване () и факта, откриване на спиране на потока.

Правило номер 1: еднонишкови програми се изпълняват psevdoposledovatelno. Това означава, че в действителност, процесорът може да изпълнява множество операции на такт, в същото време промените реда им, но всички зависимости данни са, така че поведението не се различава от серийния.
Правило номер 2: няма къде, които взеха ценности. Четене всяка променлива (с изключение на енергонезависима дълго и двойно, за които това правило не може да се извърши) ще даде на стойност по подразбиране (нула), или нещо написано на другия отбор.
И правило номер 3: Останалата част от събитията, се изпълняват в ред, ако са свързани с строг частична поръчка "се изпълнява преди" (на английски се случи преди това.).

3. Може ли да се случи, когато безизходица, използвайки методи на изчакване уведомяват?
Отговорът е да, те могат. Общоприето е "първи" нишка може да чака, докато тя се оттегли от това състояние "втори" нишка, която на свой ред се чака, докато тя се оттегля от състоянието на първо чакането тема: в очакване на друг, и абсолютно нищо няма нужда да се измисли. Проблемът на философи за хранене, предложен от Едгар Дейкстра - само по своята същност е проблем с осветлението на произхода на фиксирането в контекста на използването на изчакване / уведомява Това е много добре написана и е на разположение в "Философията на Java» Eckel: глава 17, раздел 1.17.3

Основната причина за поканата да изчакаме и да уведоми статичен единица или метод, който Java API задължително го изисква. Ако се обадите тях не са на синхронизирани блока, вашият код ще хвърлят IllegalMonitorStateException. По-хитър от причините е, за да се избегне състоянието на състезание между повикванията изчакат и да уведомяват.

Безизходица - ситуация, в която две или повече нишки са блокирани в очакване на един от друг. Dedlock наричан безизходица. След като правилно изготвено предложение. По-скоро бих написал, че застоят - фиксираща нишки. Това е ситуация, при която две или повече нишки блокират работата на другите (или чакат за всеки друг, за да продължат работата си).

Повече за осем обвинения отговори на някои смачкана и недобре насочени. Тема не означава непременно, че няма мъртвите зони (и вероятно дори обратното). В същото SCIP писмено за следното: нишка безопасно обекта ако има такива методи на обекта може да се нарече по теми, без да се засяга нейното състояние.

7 Какви са ползите от получаването на обекта, ако той е неизменна?
Пример за малко недостатъци. Клас ImmutablePoint при тази реализация трябва да направи окончателния (финал), за да се избегне възможността за препъване на "променлива" наследник. Тази точка е описана в Ефективна Java 2-ро издание в член 15.

На живо сега