JavaRush /Блоги Java /Random-TG /Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java. Қисми 3...
Roman Beekeeper
Сатҳи

Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java. Қисми 3

Дар гурӯҳ нашр шудааст
Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java. Қисми 1 Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java. Қисми 2

Мултираи

37. Чӣ тавр дар Java риштаи нав (ҷараён) сохта мешавад?

Бо ин ё он роҳ, эҷод тавассути истифодаи синфи Thread сурат мегирад. Аммо дар ин ҷо вариантҳо вуҷуд доранд ...
  1. Мо аз мерос мегиремjava.lang.Thread
  2. Мо интерфейсеро татбиқ мекунем , ки an objectи он синфи java.lang.Runnableконструкторро қабул мекунадThread
Биёед дар бораи ҳар яки онҳо сӯҳбат кунем.

Мо аз синфи Thread мерос мегирем

Барои ин кор кардан, дар синфи мо мо аз java.lang.Thread. Он дорои мет мебошад run(), ки маҳз он чизест, ки ба мо лозим аст. Тамоми ҳаёт ва мантиқи риштаи нав дар ҳамин усул хоҳад буд. Ин як навъ mainусул барои риштаи нав аст. Пас аз ин, танҳо сохтани an objectи синфи мо ва иҷро кардани метод аст start(), ки риштаи нав эҷод мекунад ва мантиқи дар он навишташударо иҷро мекунад. Биёед бубинем:
/**
* Пример того, 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();
   }
}
Натиҷаи консол чунин хоҳад буд:

Thread-1
Thread-0
Thread-2
Яъне, ҳатто дар ин ҷо мо мебинем, ки риштаҳо на бо навбат иҷро мешаванд, балки тавре ки JVM тасмим гирифтааст)

Татбиқи интерфейси Runnable

Агар шумо зидди мерос бошед ва/ё аллакай яке аз синфҳои дигарро мерос гиред, шумо метавонед java.lang.Runnable. Дар ин ҷо дар синфи худ мо ин интерфейсро амалӣ месозем ва методро татбиқ мекунем run(), тавре ки дар он мисол буд. Ба шумо танҳо лозим аст, ки an objectҳои бештар эҷод кунед Thread. Чунин ба назар мерасад, ки сатрҳои бештар бадтаранд. Аммо мо медонем, ки мерос то чӣ андоза зараровар аст ва беҳтар аст, ки аз он канорагирӣ кунем;) Биёед бубинем:
/**
* Пример того, 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();
   }
}
Ва натиҷаи иҷроиш:

Thread-0
Thread-1
Thread-2

38. Фарқи байни раванд ва ришта чист?

Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java.  Қисми 3 - 1Байни раванд ва ришта фарқиятҳои зерин мавҷуданд:
  1. Барномаи иҷрошаванда раванд номида мешавад, дар ҳоле ки Thread зермаҷмӯи раванд аст.
  2. Равандҳо мустақиланд, дар ҳоле ки риштаҳо зермаҷмӯи раванд мебошанд.
  3. Равандҳо дар хотира фазои суроғаҳои гуногун доранд, дар ҳоле ки риштаҳо фазои суроғаҳои умумӣ доранд.
  4. Гузариши контекст дар муқоиса бо равандҳо дар байни риштаҳо тезтар аст.
  5. Муоширати байни равандҳо нисбат ба иртиботи байнишаҳрӣ сусттар ва гаронтар аст.
  6. Ҳама гуна тағирот дар раванди волидайн ба раванди кӯдак таъсир намерасонад, дар ҳоле ки тағирот дар риштаи волидайн метавонад ба риштаи кӯдак таъсир расонад.

39. Бартарии чанд ришта чист?

Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java.  Қисми 3 - 2
  1. Multithreading ба барнома/барнома имкон медиҳад, ки ҳамеша ба воридот ҷавоб диҳад, ҳатто агар он аллакай баъзе вазифаҳои пасзаминаро иҷро карда бошад;
  2. Multithreading ба шумо имкон медиҳад, ки вазифаҳоро зудтар иҷро кунед, зеро риштаҳо мустақилона иҷро мешаванд;
  3. Multithreading истифодаи беҳтари кэшро таъмин мекунад, зеро риштаҳо захираҳои умумии хотираро тақсим мекунанд;
  4. Multithreading миқдори serverи лозимиро кам мекунад, зеро як server метавонад дар як вақт якчанд риштаҳоро иҷро кунад.

40. Њолатњо дар давраи њаёти ришта кадомњоянд?

Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java.  Қисми 3 - 3
  1. Нав: Дар ин ҳолат an objectи синф Threadбо истифода аз оператори нав сохта мешавад, аммо ришта вуҷуд надорад. То он даме, ки мо ба start().
  2. Runnable: Дар ин ҳолат, ришта пас аз даъват кардани усул омода аст оғоз (). Аммо, он ҳанӯз аз ҷониби нақшакаши ришта интихоб нашудааст.
  3. Иҷрокунанда: Дар ин ҳолат, нақшаи ришта риштаро аз ҳолати омода интихоб мекунад ва он кор мекунад.
  4. Интизорӣ/Бастан: Дар ин ҳолат, ришта кор намекунад, аммо ҳанӯз зинда аст ё мунтазири анҷоми риштаи дигар аст.
  5. Мурда/қатъшуда: Вақте ки усул хориҷ мешавад, run()ришта дар ҳолати қатъшуда ё мурда аст.

41. Оё риштаро ду маротиба сар кардан мумкин аст?

Не, мо наметавонем риштаро аз нав оғоз кунем, зеро вақте ки ришта оғоз ва иҷро мешавад, он ба ҳолати мурда мегузарад. Ҳамин тавр, агар мо кӯшиш кунем, ки риштаро ду маротиба иҷро кунем, он runtimeException " java.lang.IllegalThreadStateException " -ро мепартояд . Биёед бубинем:
class DoubleStartThreadExample extends Thread {

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

   /**
    * Запускаем тред дважды
    */
   public static void main(String[] args) {
       DoubleStartThreadExample doubleStartThreadExample = new DoubleStartThreadExample();
       doubleStartThreadExample.start();
       doubleStartThreadExample.start();
   }
}
Хамин ки кор ба огози дуюми хамон ришта мерасад, пас истисно мешавад. Худатон санҷед;) як бор дидан беҳтар аст аз сад бор шунидан.

42. Чӣ мешавад, агар шумо усули run()-ро мустақиман бе даъват кардани усули start() даъват кунед?

Бале, run()албатта шумо метавонед методро даъват кунед, аммо ин риштаи нав эҷод намекунад ва онро ҳамчун риштаи алоҳида иҷро намекунад. Дар ин ҳолат, он як an objectи оддӣ аст, ки усули оддиро даъват мекунад. Агар мо дар бораи усул сухан ронем start(), ин чизи дигар аст. Бо роҳандозии ин усул, runtimeон усули навро оғоз мекунад ва он, дар навбати худ, усули моро иҷро мекунад;) Агар шумо ба ман бовар накунед, онро санҷед:
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();
   }
}
Ва баромади консол чунин хоҳад буд:

0123401234
Дидан мумкин аст, ки ягон ришта офарида нашудааст. Ҳама чиз мисли синфи муқаррарӣ кор мекард. Аввал усули класси якум кор кард, баъд усули дуюм.

43. Риштаи демон чист?

Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java.  Кисми 3-4Риштаи демон (минбаъд риштаи демон номида мешавад) риштаест, ки вазифаҳоро дар замина нисбат ба риштаи дигар иҷро мекунад. Яъне, вазифаи он иҷрои вазифаҳои ёрирасон аст, ки бояд танҳо дар якҷоягӣ бо риштаи дигар (асосӣ) анҷом дода шаванд. Бисёр риштаҳои демонӣ мавҷуданд, ки ба таври худкор кор мекунанд, ба монанди Ҷамъоварии партов, ниҳоӣкунанда ва ғайра.

Чаро Java риштаи демонро мебандад?

Мақсади ягонаи риштаи демон он аст, ки он ба риштаи корбар барои вазифаи дастгирии замина хидмат мерасонад. Аз ин рӯ, агар риштаи асосӣ ба итмом расида бошад, пас вақти корӣ ба таври худкор ҳамаи риштаҳои демони онро мепӯшонад.

Усулҳои кор дар синфи Thread

Синф java.lang.Threadду усули кор бо демони риштаро пешниҳод мекунад:
  1. public void setDaemon(boolean status)- нишон медиҳад, ки ин риштаи демон хоҳад буд. Пешфарз ин аст false, ки маънои онро дорад, ки риштаҳои ғайридемонӣ эҷод карда мешаванд, агар алоҳида нишон дода нашуда бошанд.
  2. public boolean isDaemon()- аслан ин қабулкунанда барои тағирёбанда аст daemon, ки мо бо истифода аз усули қаблӣ муқаррар кардем.
Мисол:
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();
   }
}
Натиҷаи консол:

демон?.. true
демон?.. false
демон?.. false
daemon thread
user thread
user thread
Аз баромаде мебинем, ки дар дохor худи ришта бо истифода аз currentThread()усули статикӣ аз як тараф, аз кадом ришта будани он, аз тарафи дигар, агар ба an objectи ин ришта ишорае дошта бошем, метавонем фаҳмем. бевосита аз он. Ин чандирии заруриро дар конфигуратсия медиҳад.

44. Оё риштаро баъди офарида шуданаш демон кардан мумкин аст?

Не. Агар шумо ин корро кунед, он истисноро хоҳад дод IllegalThreadStateException. Аз ин рӯ, мо метавонем танҳо як риштаи демонро пеш аз оғози он созем. Мисол:
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);
   }
}
Натиҷаи консол:

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

45. Хомӯшкунӣ чист?

Shutdownhook як риштаест, ки ба таври ғайримустақим пеш аз хомӯш шудани JVM (Java Machine Virtual Machine) даъват карда мешавад. Ҳамин тавр, мо метавонем онро барои тоза кардани захира ё захира кардани ҳолат истифода барем, вақте ки мошини виртуалии Java муқаррарӣ ё ногаҳон хомӯш мешавад. Мо метавонем shutdown hookбо истифода аз усули зерин илова кунед:
Runtime.getRuntime().addShutdownHook(new ShutdownHookThreadExample());
Тавре ки дар мисол нишон дода шудааст:
/**
* Программа, которая показывает 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();
       }
   }
}
Натиҷаи консол:

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

46. ​​Синхронизатсия чист?

Синхронизатсия дар Java қобorяти назорат кардани дастрасии якчанд риштаҳо ба ҳама гуна манбаи муштарак мебошад. Вақте ки риштаҳои сершумор кӯшиш мекунанд, ки як вазифаро иҷро кунанд, эҳтимолияти натиҷаи хато вуҷуд дорад, бинобар ин барои бартараф кардани ин мушкилот, Java синхронизатсияро истифода мебарад, ки ба туфайли он дар як вақт танҳо як ришта кор карда метавонад. Синхронизатсияро бо се роҳ ба даст овардан мумкин аст:
  • Усули синхронизатсия
  • Бо ҳамоҳангсозии блоки мушаххас
  • Синхронизатсияи статикӣ

Синхронизатсияи усул

Усули ҳамоҳангшуда барои бастани an object барои ҳама гуна манбаи муштарак истифода мешавад. Вақте ки ришта усули ҳамоҳангшударо даъват мекунад, он ба таври худкор қулфро дар он an object ба даст меорад ва вақте ки ришта вазифаи худро анҷом медиҳад, онро озод мекунад. Барои кор кардани он, шумо бояд калимаи калидии ҳамоҳангшударо илова кунед . Биёед бубинем, ки ин бо мисол чӣ гуна кор мекунад:
/**
* Пример, где мы синхронизируем метод. То есть добавляем ему слово 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);
   }
}
Ва натиҷа ба консол:

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

Блоки синхронизатсия

Блоки ҳамоҳангшуда метавонад барои иҷрои ҳамоҳангсозӣ дар ҳама гуна манбаи усули мушаххас истифода шавад. Биёед бигӯем, ки дар усули калон (бале, шумо наметавонед чунин чизҳоро нависед, аммо баъзан чунин мешавад) ба шумо лозим аст, ки танҳо як қисми хурдро бо ягон сабаб ҳамоҳанг созед. Агар шумо ҳамаи рамзҳои усулро дар блоки ҳамоҳангшуда ҷойгир кунед, он ҳамон тавре ки усули ҳамоҳангшуда кор мекунад. Синтаксис чунин менамояд:
synchronized (“an object для блокировки”) {
   // сам code, который нужно защитить
}
Барои такрор накардани мисоли қаблӣ, мо тавассути синфҳои номаълум риштаҳо эҷод мекунем - яъне фавран интерфейси Runnable -ро татбиқ мекунем.
/**
* Вот 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();
   }
}

}
ва баромад ба консол

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

Синхронизатсияи статикӣ

Агар шумо усули статикиро ҳамоҳанг созед, қулф дар синф хоҳад буд, на дар an object. Дар ин мисол, мо калимаи калидии ҳамоҳангшударо ба усули статикӣ барои иҷрои ҳамоҳангсозии статикӣ истифода мебарем:
/**
* Вот 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();
   }
}
ва баромад ба консол:

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

47. Таѓйирёбандаи ноустувор чист?

Калимаи калидӣ volatileдар барномасозии чанд ришта барои таъмини бехатарии ришта истифода мешавад, зеро тағир додани як тағирёбандаи тағирёбанда барои ҳама риштаҳои дигар намоён аст, бинобар ин як тағирёбанда метавонад аз ҷониби як ришта дар як вақт истифода шавад. Бо истифода аз калимаи калидӣ, volatileшумо метавонед кафолат диҳед, ки тағирёбанда аз ришта бехатар аст ва дар хотираи муштарак нигоҳ дошта мешавад ва риштаҳо онро ба кэши худ намегиранд. Он ба чӣ монанд аст?
private volatile AtomicInteger count;
Мо танҳо ба тағирёбанда илова мекунем volatile. Аммо ин маънои бехатарии пурраи риштаро надорад... Охир, амалиётҳо дар як тағирёбанда атомӣ буда наметавонанд. Аммо шумо метавонед Atomicсинфҳоеро истифода баред, ки амалиётро ба таври атомӣ иҷро мекунанд, яъне дар як иҷро аз ҷониби протсессор. Бисёре аз чунин синфҳоро дар баста пайдо кардан мумкин аст java.util.concurrent.atomic.

48. Бунбаст чист?

Сарбаста дар Java як қисми мултипреадинг аст. Бунбаст метавонад дар вазъияте ба амал ояд, ки ришта дар қулфи an objectи бо риштаи дигар гирифташуда интизор аст ва риштаи дуюм дар қулфи an objectи аз риштаи аввал гирифташуда интизор аст. Ҳамин тариқ, ин ду ришта ҳамдигарро интизоранд ва иҷрои codeи худро идома намедиҳанд. Top 50 Саволҳо ва Ҷавобҳои Мусоҳибаи асосии Java.  Кисми 3 — 5Биёед мисолеро бубинем, ки дар он синфе мавҷуд аст, ки Runnable -ро амалӣ мекунад. Он дар созандаи худ ду захираро қабул мекунад. Дар дохor усули run(), он қулфро барои онҳо як ба як мегирад, бинобар ин, агар шумо ду an objectи ин синфро эҷод кунед ва захираҳоро бо фармоишҳои гуногун интиқол диҳед, шумо метавонед ба осонӣ ба қулф дучор шавед:
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);
           }
       }
   }
}
Натиҷаи консол:

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

49. Чӣ тавр аз бунбаст канорагирӣ кардан мумкин аст?

Дар асоси он чизе, ки мо медонем, ки чӣ гуна бунбаст рух медиҳад, мо метавонем баъзе хулосаҳоро барем...
  • Тавре ки дар мисоли боло нишон дода шудааст, бунбаст аз сабаби лона кардани қуфлҳо буд. Яъне дар дохor як қулфи дигар ё бештар аз он мавҷуд аст. Инро бо роҳи зерин пешгирӣ кардан мумкин аст - ба ҷои лона кардан, шумо бояд абстраксияи навро дар боло илова кунед ва қулфро ба сатҳи баландтар диҳед ва қуфлҳои лонаро хориҷ кунед.
  • Чӣ қадаре ки басташавӣ вуҷуд дошта бошад, ҳамон қадар эҳтимолияти сар задани бунбаст зиёд мешавад. Аз ин рӯ, ҳар дафъае, ки шумо қулф илова мекунед, шумо бояд дар бораи он фикр кунед, ки оё он воқеан лозим аст ва оё аз илова кардани қулфи нав пешгирӣ кардан мумкин аст.
  • Истифода мебарад Thread.join(). Бунбаст инчунин метавонад сурат гирад, вақте ки як ришта риштаи дигарро интизор аст. join()Барои роҳ надодан ба ин мушкилот, шумо метавонед як маҳдудияти вақтро барои усул муқаррар кунед .
  • Агар мо як ришта дошта бошем, бунбаст нахоҳад буд;)

50. Шарти мусобиқа чист?

Агар дар пойгаҳои воқеӣ мошинҳо баромад кунанд, пас дар истилоҳоти пойгаи бисёр ришта риштаҳо дар пойгаҳо баромад мекунанд. Аммо барои чӣ? Ду ришта вуҷуд дорад, ки кор мекунанд ва онҳо метавонанд ба як an object дастрасӣ дошта бошанд. Ва онҳо метавонанд кӯшиш кунанд, ки дар як вақт ҳолати навсозӣ кунанд. То ҳол ҳама чиз равшан аст, дуруст? Ҳамин тариқ, риштаҳо ё дар баробари воқеӣ (агар дар протсессори зиёда аз як ядро ​​мавҷуд бошад) ё шартан дар баробари мувозӣ кор мекунанд, вақте ки протсессор як муддати кӯтоҳ вақт ҷудо мекунад. Ва мо ин равандҳоро назорат карда наметавонем, бинобар ин мо кафолат дода наметавонем, ки вақте як ришта маълумотро аз an object мехонад, пеш аз он ки ягон риштаи дигар ин корро анҷом диҳад, вай вақт дорад, ки онро тағир диҳад. Мушкилоти ба ин монанд ҳангоми гузаштани ин комбинатсияи санҷиш ва амал рӯй медиҳанд. Ин чӣ маъно дорад? Масалан, мо ifифодае дорем, ки дар баданаш худи шарт тагйир меёбад, яъне:
int z = 0;

// проверь
if (z < 5) {
//действуй
   z = z + 5;
}
Пас, мумкин аст вазъияте ба миён ояд, ки ду ришта дар як вақт ба ин блоки code ворид мешаванд, ки z ҳанӯз ба сифр баробар аст ва онҳо якҷоя ин арзишро иваз мекунанд. Ва дар ниҳоят мо арзиши пешбинишудаи 5, балки 10-ро ба даст намеорем. Чӣ тавр аз ин пешгирӣ кардан мумкин аст? Шумо бояд пеш аз иҷроиш ва пас аз он қулф кунед. Яъне, барои ворид шудани риштаи аввал ба блок if, тамоми амалҳоро иҷро кунед, онро тағир диҳед zва танҳо баъд ба риштаи оянда имкони ин корро диҳед. Аммо риштаи навбатӣ ба блок дохил намешавад if, зеро zон аллакай ба 5 баробар мешавад:
// получить блокировку для z
if (z < 5) {
   z = z + 5;
}
// выпустить из блокировки z
===================================================

Ба чои баромад

Мехохам ташаккур ба хамае ки то охир хонданд. Ин як сафари тӯлонӣ буд ва шумо онро анҷом додед! На ҳама чиз равшан аст. Ин хуб аст. Ҳамин ки ман ба омӯзиши Java оғоз кардам, ман сарамро дар атрофи он чӣ будани тағирёбандаи статикӣ печонида натавонистам. Аммо ҳеҷ чиз, бо ин андеша хоб рафтам, чанд сарчашмаи дигар хондам ва ниҳоят фаҳмидам. Омодагӣ ба мусоҳиба бештар кори илмӣ аст, на кори амалӣ. Аз ин рӯ, пеш аз ҳар як мусоҳиба, шумо бояд чизҳоеро, ки шумо аксар вақт истифода намебаред, такрор кунед ва хотираи худро нав кунед.

Ва чун ҳамеша, истинодҳои муфид:

Ташаккур ба ҳама барои хондан, Ба наздикӣ дидан кунед) Профor ман дар GitHub
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION