JavaRush /Java blogi /Random-UZ /Eng yaxshi 50 Java asosiy intervyu savollari va javoblari...

Eng yaxshi 50 Java asosiy intervyu savollari va javoblari. 3-qism

Guruhda nashr etilgan
Eng yaxshi 50 Java asosiy intervyu savollari va javoblari. 1-qism Java-ning asosiy 50 ta eng yaxshi intervyu savollari va javoblari. 2-qism

Ko'p tarmoqli

37. Java tilida yangi ip (oqim) qanday yaratiladi?

Qanday bo'lmasin, yaratish Thread sinfidan foydalanish orqali amalga oshiriladi. Ammo bu erda variantlar bo'lishi mumkin ...
  1. dan meros olamizjava.lang.Thread
  2. java.lang.RunnableBiz obyekti konstruktor Threadsinfini qabul qiladigan interfeysni amalga oshiramiz
Keling, ularning har biri haqida gapiraylik.

Biz Thread sinfidan meros olamiz

Buni amalga oshirish uchun sinfimizda biz meros qilib olamiz java.lang.Thread. U methni o'z ichiga oladi run(), bu bizga kerak bo'lgan narsadir. Yangi ipning butun hayoti va mantig'i shu usulda bo'ladi. mainBu yangi mavzu uchun bir xil usul. Shundan so'ng, bizning sinfimiz ob'ektini yaratish va start()yangi mavzuni yaratadigan va unda yozilgan mantiqni ishga tushiradigan usulni bajarish qoladi. Keling, qaraylik:
/**
* Пример того, How создавать треды путем наследования {@link Thread} класса.
*/
class ThreadInheritance extends Thread {

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName());
   }

   public static void main(String[] args) {
       ThreadInheritance threadInheritance1 = new ThreadInheritance();
       ThreadInheritance threadInheritance2 = new ThreadInheritance();
       ThreadInheritance threadInheritance3 = new ThreadInheritance();
       threadInheritance1.start();
       threadInheritance2.start();
       threadInheritance3.start();
   }
}
Konsol chiqishi quyidagicha bo'ladi:

Thread-1
Thread-0
Thread-2
Ya'ni, bu erda ham biz iplar navbat bilan emas, balki JVM qaror qilganidek bajarilganligini ko'ramiz)

Runnable interfeysini amalga oshirish

Agar siz merosga qarshi bo'lsangiz va/yoki boshqa sinflardan birini meros qilib olgan bo'lsangiz, java.lang.Runnable. Mana, sinfimizda biz ushbu interfeysni amalga oshiramiz va run()o'sha misolda bo'lgani kabi usulni amalga oshiramiz. Siz shunchaki ko'proq ob'ektlar yaratishingiz kerak Thread. Ko'rinishidan, ko'proq chiziqlar yomonroq. Ammo biz merosning qanchalik zararli ekanligini va undan qochish yaxshiroq ekanligini bilamiz;) Keling, ko'rib chiqaylik:
/**
* Пример того, How создавать треды из интерфейса {@link Runnable}.
* Здесь проще простого - реализуем этот интерфейс и потом передаем в конструктор
* экземпляр реализуемого an object.
*/
class ThreadInheritance implements Runnable {

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName());
   }

   public static void main(String[] args) {
       ThreadInheritance runnable1 = new ThreadInheritance();
       ThreadInheritance runnable2 = new ThreadInheritance();
       ThreadInheritance runnable3 = new ThreadInheritance();

       Thread threadRunnable1 = new Thread(runnable1);
       Thread threadRunnable2 = new Thread(runnable2);
       Thread threadRunnable3 = new Thread(runnable3);

       threadRunnable1.start();
       threadRunnable2.start();
       threadRunnable3.start();
   }
}
Va bajarilish natijasi:

Thread-0
Thread-1
Thread-2

38. Jarayon va ip o'rtasidagi farq nima?

Eng yaxshi 50 Java asosiy intervyu savollari va javoblari.  3-1-qismJarayon va ip o'rtasida quyidagi farqlar mavjud:
  1. Amalga oshirilayotgan dastur jarayon deb ataladi, Thread esa jarayonning kichik to'plamidir.
  2. Jarayonlar mustaqil, iplar esa jarayonning kichik to'plamidir.
  3. Jarayonlar xotirada turli xil manzil maydoniga ega, iplar esa umumiy manzil maydonini o'z ichiga oladi.
  4. Kontekstni almashtirish jarayonlarga qaraganda iplar o'rtasida tezroq.
  5. Jarayonlararo aloqa tarmoqlararo aloqaga qaraganda sekinroq va qimmatroq.
  6. Ota-ona jarayonidagi har qanday o'zgarishlar bola jarayoniga ta'sir qilmaydi, ota-ona ipidagi o'zgarishlar esa asosiy jarayonga ta'sir qilishi mumkin.

39. Ko'p oqimning afzalliklari nimada?

Eng yaxshi 50 Java asosiy intervyu savollari va javoblari.  3-2 qism
  1. Multithreading ilova/dasturga ba'zi fon vazifalarini bajarayotgan bo'lsa ham har doim kiritilgan ma'lumotlarga javob berishga imkon beradi;
  2. Multithreading sizga vazifalarni tezroq bajarish imkonini beradi, chunki iplar mustaqil ravishda ishlaydi;
  3. Multithreading keshdan yaxshiroq foydalanishni ta'minlaydi, chunki iplar umumiy xotira resurslaridan foydalanadi;
  4. Multithreading talab qilinadigan server miqdorini kamaytiradi, chunki bitta server bir vaqtning o'zida bir nechta oqimlarni ishga tushirishi mumkin.

40. Ipning hayot siklida qanday holatlar mavjud?

Eng yaxshi 50 Java asosiy intervyu savollari va javoblari.  3-3 qism
  1. Yangi: Bu holatda sinf ob'ekti Threadnew operatori yordamida yaratiladi, lekin ip mavjud emas. ga qo'ng'iroq qilmagunimizcha mavzu boshlanmaydi start().
  2. Runnable: Bu holatda, ip usulni chaqirgandan so'ng ishlashga tayyor start(). Biroq, u hali mavzu rejalashtiruvchisi tomonidan tanlanmagan.
  3. Ishlash: Bu holatda, ipni rejalashtiruvchi tayyor holatdan ipni tanlaydi va u ishlaydi.
  4. Kutilmoqda/Bloklangan: Bu holatda, ip ishlamayapti, lekin hali ham tirik yoki boshqa ip tugashini kutmoqda.
  5. O'lik/tugatilgan: Usul chiqqanda, run()ip tugatilgan yoki o'lik holatda bo'ladi.

41. Ipni ikki marta boshlash mumkinmi?

Yo'q, biz ipni qayta ishga tushira olmaymiz, chunki ip ishga tushirilgandan va bajarilgandan so'ng u o'lik holatga o'tadi. Shunday qilib, agar biz ipni ikki marta ishga tushirishga harakat qilsak, u runtimeException " java.lang.IllegalThreadStateException " ni chiqaradi. Keling, qaraylik:
class DoubleStartThreadExample extends Thread {

   /**
    * Имитируем работу треда
    */
   public void run() {
	// что-то происходит. Для нас не существенно на этом этапе
   }

   /**
    * Запускаем тред дважды
    */
   public static void main(String[] args) {
       DoubleStartThreadExample doubleStartThreadExample = new DoubleStartThreadExample();
       doubleStartThreadExample.start();
       doubleStartThreadExample.start();
   }
}
Ish xuddi shu ipning ikkinchi boshiga etib borishi bilanoq, istisno bo'ladi. O'zingiz sinab ko'ring;) yuz marta eshitgandan ko'ra bir marta ko'rgan afzal.

42. Agar start() usulini chaqirmasdan to'g'ridan-to'g'ri run() usulini chaqirsangiz nima bo'ladi?

Ha, run()albatta, siz usulni chaqirishingiz mumkin, lekin bu yangi ish zarrachasini yaratmaydi va uni alohida mavzu sifatida bajarmaydi. Bunday holda, u oddiy usulni chaqiradigan oddiy ob'ektdir. Agar biz usul haqida gapiradigan bo'lsak start(), unda bu boshqa masala. Ushbu usulni ishga tushirish orqali runtimeu yangisini ishga tushiradi va u o'z navbatida bizning usulimizni ishga tushiradi;) Agar menga ishonmasangiz, sinab ko'ring:
class ThreadCallRunExample extends Thread {

   public void run() {
       for (int i = 0; i < 5; i++) {
           System.out.print(i);
       }
   }

   public static void main(String args[]) {
       ThreadCallRunExample runExample1 = new ThreadCallRunExample();
       ThreadCallRunExample runExample2 = new ThreadCallRunExample();

       // просто будут вызваны в потоке main два метода, один за другим.
       runExample1.run();
       runExample2.run();
   }
}
Va konsolga chiqish quyidagicha bo'ladi:

0123401234
Ko'rinib turibdiki, hech qanday ip yaratilmagan. Hammasi oddiy sinf kabi ishladi. Avval birinchi sinf usuli, keyin ikkinchisi ishladi.

43. Demon ipi nima?

Eng yaxshi 50 Java asosiy intervyu savollari va javoblari.  3-4 qismDaemon ipi (keyingi o'rinlarda demon ipi deb yuritiladi) boshqa ipga nisbatan fonda vazifalarni bajaradigan ipdir. Ya'ni, uning vazifasi faqat boshqa (asosiy) ip bilan birgalikda bajarilishi kerak bo'lgan yordamchi vazifalarni bajarishdir. Garbage Collector, finalizer va boshqalar kabi avtomatik ishlaydigan ko'plab demon iplari mavjud.

Nima uchun Java daemon ishini yopadi?

Demon ipining yagona maqsadi shundaki, u foydalanuvchi oqimiga fonni qo'llab-quvvatlash vazifasi uchun xizmatlarni taqdim etadi. Shuning uchun, agar asosiy ish zarrachalari tugallangan bo'lsa, u holda ish vaqti avtomatik ravishda barcha demon iplarini yopadi.

Thread sinfida ishlash usullari

Sinf java.lang.Threadip demoni bilan ishlashning ikkita usulini taqdim etadi:
  1. public void setDaemon(boolean status)- bu demon ipi bo'lishini ko'rsatadi. Odatiy bo'lib false, bu alohida ko'rsatilmagan bo'lsa, demon bo'lmagan iplar yaratilishini anglatadi.
  2. public boolean isDaemon()daemon- aslida bu biz oldingi usul yordamida o'rnatgan o'zgaruvchi uchun oluvchi .
Misol:
class DaemonThreadExample extends Thread {

   public void run() {
       // Проверяет, демон ли этот поток or нет
       if (Thread.currentThread().isDaemon()) {
           System.out.println("daemon thread");
       } else {
           System.out.println("user thread");
       }
   }

   public static void main(String[] args) {
       DaemonThreadExample thread1 = new DaemonThreadExample();
       DaemonThreadExample thread2 = new DaemonThreadExample();
       DaemonThreadExample thread3 = new DaemonThreadExample();

       // теперь thread1 - поток-демон.
       thread1.setDaemon(true);

       System.out.println("демон?.. " + thread1.isDaemon());
       System.out.println("демон?.. " + thread2.isDaemon());
       System.out.println("демон?.. " + thread3.isDaemon());

       thread1.start();
       thread2.start();
       thread3.start();
   }
}
Konsol chiqishi:

демон?.. true
демон?.. false
демон?.. false
daemon thread
user thread
user thread
Chiqarishdan ko'ramizki, ipning o'zida, statik currentThread()usuldan foydalanib, biz bir tomondan uning qaysi ip ekanligini aniqlashimiz mumkin, ikkinchi tomondan, agar bizda ushbu ipning ob'ektiga havola bo'lsa, biz buni bilib olamiz. to'g'ridan-to'g'ri undan. Bu konfiguratsiyada kerakli moslashuvchanlikni beradi.

44. Ip yaratilgandan keyin uni demon qilish mumkinmi?

Yo'q. Agar buni qilsangiz, u istisno qiladi IllegalThreadStateException. Shuning uchun, biz faqat boshlanishidan oldin demon ipini yaratishimiz mumkin. Misol:
class SetDaemonAfterStartExample extends Thread {

   public void run() {
       System.out.println("Working...");
   }

   public static void main(String[] args) {
       SetDaemonAfterStartExample afterStartExample = new SetDaemonAfterStartExample();
       afterStartExample.start();

       // здесь будет выброшено исключение
       afterStartExample.setDaemon(true);
   }
}
Konsol chiqishi:

Working...
Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.setDaemon(Thread.java:1359)
	at SetDaemonAfterStartExample.main(SetDaemonAfterStartExample.java:14)

45. O'chirish kancasi nima?

Shutdownhook - bu JVM (Java Virtual Machine) yopilishidan oldin bilvosita chaqiriladigan mavzu. Shunday qilib, biz undan resursni tozalash yoki Java virtual mashinasi normal yoki to'satdan yopilganda holatni saqlash uchun foydalanishimiz mumkin. shutdown hookBiz quyidagi usul yordamida qo'shishimiz mumkin :
Runtime.getRuntime().addShutdownHook(new ShutdownHookThreadExample());
Misolda ko'rsatilganidek:
/**
* Программа, которая показывает How запустить shutdown hook тред,
* который выполнится аккурат до окончания работы JVM
*/
class ShutdownHookThreadExample extends Thread {

   public void run() {
       System.out.println("shutdown hook задачу выполнил");
   }

   public static void main(String[] args) {

       Runtime.getRuntime().addShutdownHook(new ShutdownHookThreadExample());

       System.out.println("Теперь программа засыпает, нажмите ctrl+c чтоб завершить ее.");
       try {
           Thread.sleep(60000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
}
Konsol chiqishi:

Теперь программа засыпает, нажмите ctrl+c чтоб завершить ее.
shutdown hook задачу выполнил

46. ​​Sinxronizatsiya nima?

Java-da sinxronizatsiya - bu har qanday umumiy manbaga bir nechta mavzularning kirishini boshqarish qobiliyati. Bir nechta iplar bir xil vazifani bajarishga harakat qilganda, noto'g'ri natijaga erishish ehtimoli mavjud, shuning uchun bu muammoni bartaraf etish uchun Java sinxronizatsiyadan foydalanadi, buning natijasida bir vaqtning o'zida faqat bitta ip ishlashi mumkin. Sinxronizatsiya uchta usulda amalga oshirilishi mumkin:
  • Sinxronizatsiya usuli
  • Muayyan blokni sinxronlash orqali
  • Statik sinxronizatsiya

Sinxronizatsiya usuli

Sinxronlashtirilgan usul har qanday umumiy manba uchun ob'ektni bloklash uchun ishlatiladi. Ip sinxronlashtirilgan usulni chaqirganda, u avtomatik ravishda ushbu ob'ektda qulfni oladi va ip o'z vazifasini bajargandan so'ng uni chiqaradi. Buni ishlashi uchun sinxronlashtirilgan kalit so'zni qo'shishingiz kerak . Keling, bu qanday ishlashini misol bilan ko'rib chiqaylik:
/**
* Пример, где мы синхронизируем метод. То есть добавляем ему слово synchronized.
* Есть два писателя, которые хотят использовать один принтер. Они подготовor свои поэмы
* И конечно же не хотят, чтоб их поэмы перемешались, а хотят, чтоб работа была сделана по * * * очереди для каждого из них
*/
class Printer {

   synchronized void print(List<String> wordsToPrint) {
       wordsToPrint.forEach(System.out::print);
       System.out.println();
   }

   public static void main(String args[]) {
       // один an object для двух тредов
       Printer printer  = new Printer();

       // создаем два треда
       Writer1 writer1 = new Writer1(printer);
       Writer2 writer2 = new Writer2(printer);

       // запускаем их
       writer1.start();
       writer2.start();
   }
}

/**
* Писатель номер 1, который пишет свою поэму.
*/
class Writer1 extends Thread {
   Printer printer;

   Writer1(Printer printer) {
       this.printer = printer;
   }

   public void run() {
       List<string> poem = Arrays.asList("Я ", this.getName(), " Пишу", " Письмо");
       printer.print(poem);
   }

}

/**
* Писатель номер 2, который пишет свою поэму.
*/
class Writer2 extends Thread {
   Printer printer;

   Writer2(Printer printer) {
       this.printer = printer;
   }

   public void run() {
       List<String> poem = Arrays.asList("Не Я ", this.getName(), " Не пишу", " Не Письмо");
       printer.print(poem);
   }
}
Va konsolga chiqish:

Я Thread-0 Пишу Письмо
Не Я Thread-1 Не пишу Не Письмо

Sinxronizatsiya bloki

Sinxronlashtirilgan blok har qanday maxsus usul resursida sinxronlashni amalga oshirish uchun ishlatilishi mumkin. Aytaylik, katta usulda (ha, ha, siz bunday narsalarni yozolmaysiz, lekin ba'zida shunday bo'ladi) ba'zi sabablarga ko'ra faqat kichik bir qismni sinxronlashtirishingiz kerak. Usulning barcha kodlarini sinxronlashtirilgan blokga qo'ysangiz, u sinxronlashtirilgan usul bilan bir xil ishlaydi. Sintaksis quyidagicha ko'rinadi:
synchronized (“an object для блокировки”) {
   // сам code, который нужно защитить
}
Oldingi misolni takrorlamaslik uchun biz anonim sinflar orqali iplarni yaratamiz, ya'ni darhol Runnable interfeysini amalga oshiramiz.
/**
* Вот How добавляется блок синхронизации.
* Внутри нужно указать у кого будет взят мьютекс для блокировки.
*/
class Printer {

   void print(List<String> wordsToPrint) {
       synchronized (this) {
           wordsToPrint.forEach(System.out::print);
       }
       System.out.println();
   }

   public static void main(String args[]) {
       // один an object для двух тредов
       Printer printer = new Printer();

       // создаем два треда
       Thread writer1 = new Thread(new Runnable() {
           @Override
           public void run() {
               List<String> poem = Arrays.asList("Я ", "Writer1", " Пишу", " Письмо");
               printer.print(poem);
           }
       });
       Thread writer2 = new Thread(new Runnable() {
           @Override
           public void run() {
               List<String> poem = Arrays.asList("Не Я ", "Writer2", " Не пишу", " Не Письмо");
               printer.print(poem);
           }
       });

       // запускаем их
       writer1.start();
       writer2.start();
   }
}

}
va konsolga chiqaring

Я Writer1 Пишу Письмо
Не Я Writer2 Не пишу Не Письмо

Statik sinxronizatsiya

Agar siz statik usulni sinxronlashtirsangiz, blokirovka ob'ektda emas, balki sinfda bo'ladi. Ushbu misolda biz sinxronlashtirilgan kalit so'zni statik sinxronizatsiyani amalga oshirish uchun statik usulga qo'llaymiz:
/**
* Вот How добавляется блок синхронизации.
* Внутри нужно указать у кого будет взят мьютекс для блокировки.
*/
class Printer {

   static synchronized void print(List<String> wordsToPrint) {
       wordsToPrint.forEach(System.out::print);
       System.out.println();
   }

   public static void main(String args[]) {

       // создаем два треда
       Thread writer1 = new Thread(new Runnable() {
           @Override
           public void run() {
               List<String> poem = Arrays.asList("Я ", "Writer1", " Пишу", " Письмо");
               Printer.print(poem);
           }
       });
       Thread writer2 = new Thread(new Runnable() {
           @Override
           public void run() {
               List<String> poem = Arrays.asList("Не Я ", "Writer2", " Не пишу", " Не Письмо");
               Printer.print(poem);
           }
       });

       // запускаем их
       writer1.start();
       writer2.start();
   }
}
va konsolga chiqish:

Не Я Writer2 Не пишу Не Письмо
Я Writer1 Пишу Письмо

47. O'zgaruvchan o'zgaruvchi nima?

Kalit so'z volatileko'p tarmoqli dasturlashda ip xavfsizligini ta'minlash uchun ishlatiladi, chunki bitta o'zgaruvchan o'zgaruvchiga kiritilgan o'zgartirish boshqa barcha oqimlarga ko'rinadi, shuning uchun bitta o'zgaruvchidan bir vaqtning o'zida bitta ip tomonidan ishlatilishi mumkin. Kalit so'zdan foydalanib, volatilesiz o'zgaruvchining ish zarralari xavfsiz bo'lishiga va umumiy xotirada saqlanishiga kafolat bera olasiz va iplar uni keshiga olmaydi. Bu nimaga o'xshaydi?
private volatile AtomicInteger count;
Biz faqat o'zgaruvchiga qo'shamiz volatile. Ammo bu to'liq ip xavfsizligini anglatmaydi ... Axir, operatsiyalar o'zgaruvchida atomik bo'lmasligi mumkin. Lekin siz Atomicoperatsiyani atomik, ya'ni protsessor tomonidan bitta bajarishda bajaradigan sinflardan foydalanishingiz mumkin. Ko'pgina bunday sinflarni paketda topish mumkin java.util.concurrent.atomic.

48. Tugallanish nima

Java-dagi o'lik blok ko'p ish zarralarining bir qismidir. Tugallanish, ip boshqa ip tomonidan olingan ob'ekt blokirovkasida, ikkinchi ip esa birinchi ip tomonidan olingan ob'ekt blokirovkasida kutayotgan vaziyatda yuzaga kelishi mumkin. Shunday qilib, bu ikki oqim bir-birini kutadi va kodini bajarishda davom etmaydi. Eng yaxshi 50 Java asosiy intervyu savollari va javoblari.  3-5 qismKeling, Runnable dasturini amalga oshiradigan sinf mavjud bo'lgan misolni ko'rib chiqaylik. U o'z konstruktorida ikkita manbani qabul qiladi. Run() usuli ichida u ular uchun qulfni birma-bir oladi, shuning uchun agar siz ushbu sinfning ikkita ob'ektini yaratsangiz va resurslarni turli xil tartibda o'tkazsangiz, siz osongina qulfga kirishingiz mumkin:
class DeadLock {

   public static void main(String[] args) {
       final Integer r1 = 10;
       final Integer r2 = 15;

       DeadlockThread threadR1R2 = new DeadlockThread(r1, r2);
       DeadlockThread threadR2R1 = new DeadlockThread(r2, r1);

       new Thread(threadR1R2).start();
       new Thread(threadR2R1).start();
   }
}

/**
* Класс, который принимает два ресурса.
*/
class DeadlockThread implements Runnable {

   private final Integer r1;
   private final Integer r2;

   public DeadlockThread(Integer r1, Integer r2) {
       this.r1 = r1;
       this.r2 = r2;
   }

   @Override
   public void run() {
       synchronized (r1) {
           System.out.println(Thread.currentThread().getName() + " захватил ресурс: " + r1);

           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }

           synchronized (r2) {
               System.out.println(Thread.currentThread().getName() + " захватил ресурс: " + r2);
           }
       }
   }
}
Konsol chiqishi:

Первый тред захватил первый ресурс
Второй тред захватывает второй ресурс

49. Qanday qilib boshi berk ko'chadan qochish kerak?

O'lik qanday sodir bo'lishini bilgan narsalarimizga asoslanib, biz ba'zi xulosalar chiqarishimiz mumkin ...
  • Yuqoridagi misolda ko'rsatilganidek, o'lik qulflarning uyasi bilan bog'liq edi. Ya'ni, bitta qulf ichida boshqa yoki undan ko'p. Bunga quyidagi yo'l bilan yo'l qo'ymaslik mumkin - joylashtirish o'rniga, tepaga yangi abstraktsiya qo'shishingiz va qulfni yuqori darajaga berishingiz va ichki o'rnatilgan qulflarni olib tashlashingiz kerak.
  • Qanchalik ko'p blokirovka bo'lsa, tiqilib qolish ehtimoli shunchalik yuqori bo'ladi. Shuning uchun, har safar qulf qo'shsangiz, u haqiqatan ham kerakmi va yangisini qo'shishdan qochish mumkinmi, deb o'ylashingiz kerak.
  • Foydalanadi Thread.join(). Bir ip boshqasini kutayotganda ham blokirovka qilish mumkin. join()Ushbu muammoning oldini olish uchun siz usulda vaqt chegarasini belgilashni o'ylab ko'rishingiz mumkin .
  • Agar bizda bitta mavzu bo'lsa, hech qanday to'siq bo'lmaydi;)

50. Poyga sharti nima?

Agar haqiqiy poygalarda mashinalar harakat qilsa, u holda ko'p ipli poyga terminologiyasida iplar poygalarda ishlaydi. Lekin nima uchun? Ishlayotgan va bir xil ob'ektga kirish huquqiga ega bo'lgan ikkita ip mavjud. Va ular bir vaqtning o'zida davlatni yangilashga harakat qilishlari mumkin. Hozircha hamma narsa aniq, to'g'rimi? Shunday qilib, iplar haqiqiy parallel ravishda (agar protsessorda bir nechta yadro bo'lsa) yoki shartli ravishda parallel ravishda, protsessor qisqa vaqtni ajratganda ishlaydi. Va biz bu jarayonlarni nazorat qila olmaymiz, shuning uchun biz bitta ip ob'ektdan ma'lumotni o'qiganda, uni boshqa bir ip amalga oshirishdan oldin uni o'zgartirish uchun vaqt bo'lishiga kafolat bera olmaymiz. Bu kabi muammolar sinov va harakat kombinatsiyasidan o'tganda yuzaga keladi. Bu nima degani? Masalan, iftanasida shartning o'zi o'zgargan ifoda mavjud, ya'ni:
int z = 0;

// проверь
if (z < 5) {
//действуй
   z = z + 5;
}
Shunday qilib, z hali nolga teng bo'lgan va birgalikda bu qiymatni o'zgartiradigan bir vaqtning o'zida ikkita ip bir vaqtning o'zida ushbu kod blokiga kirishi mumkin. Va oxirida biz kutilgan 5 qiymatini olmaymiz, lekin 10. Bunga qanday yo'l qo'ymaslik kerak? Siz ijrodan oldin va keyin qulflashingiz kerak. Ya'ni blokga kirish uchun birinchi ip if, barcha amallarni bajaring, uni o'zgartiring zva shundan keyingina keyingi ipga buni qilish imkoniyatini bering. Ammo keyingi ip blokga kirmaydi if, chunki zu allaqachon 5 ga teng bo'ladi:
// получить блокировку для z
if (z < 5) {
   z = z + 5;
}
// выпустить из блокировки z
===================================================

Chiqish o'rniga

Oxirigacha o'qigan barchaga rahmat aytmoqchiman. Bu uzoq safar edi va siz bunga erishdingiz! Hamma narsa aniq bo'lmasligi mumkin. Bu odatiy. Java tilini o'rganishni boshlaganimdan so'ng, statik o'zgaruvchi nima ekanligini tushunolmadim. Lekin hech narsa, men bu fikr bilan uxladim, yana bir nechta manbalarni o'qib chiqdim va nihoyat tushundim. Suhbatga tayyorgarlik amaliy masaladan ko'ra ko'proq akademik masaladir. Shuning uchun, har bir suhbatdan oldin siz tez-tez ishlatib bo'lmaydigan narsalarni takrorlashingiz va xotirangizni yangilashingiz kerak.

Va har doimgidek, foydali havolalar:

O'qiganingiz uchun barchangizga rahmat, yaqinda ko'rishguncha) GitHub-dagi profilim
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION