Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° JavaΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 68

Автор Н.А. Вязовик

ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ возникновСния Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ заставляСт с особСнным Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. НапримСр, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ sleep(..), Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя, Π½ΠΎ ΠΏΡ€ΠΈ этом всС Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ нСдоступными для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ со стороны Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π° это ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ deadlock. Π’Π°ΠΊΠΈΠ΅ ситуации ΠΊΡ€Π°ΠΉΠ½Π΅ слоТно Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ тСстирования ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, поэтому вопросам синхронизации Π½Π°Π΄ΠΎ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° этапС проСктирования.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ wait(), notify(), notifyAll() класса Object

НаконСц, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Ρ‚Ρ€Π΅Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса Object, Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ описаниС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ многопоточности Π² Java.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Java ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для synchronized Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ ΠΈ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ wait-set, Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² исполнСния. Π›ΡŽΠ±ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ wait() любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² Π΅Π³ΠΎ wait-set. ΠŸΡ€ΠΈ этом Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° приостанавливаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρƒ этого ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ notifyAll(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΠ· wait-set. ΠœΠ΅Ρ‚ΠΎΠ΄ notify() ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ случайно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.

Однако ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² связано с ΠΎΠ΄Π½ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ. Π›ΡŽΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС установлСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π»ΠΈΠ±ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ synchronized -Π±Π»ΠΎΠΊΠ° с ссылкой Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π»ΠΈΠ±ΠΎ обращСния ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² синхронизированных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… класса самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


public class WaitThread implements Runnable {

private Object shared;

public WaitThread(Object o) {

shared=o;

}

public void run() {

synchronized (shared) {

try {

shared.wait();

}

catch (InterruptedException e) {


}

System.out.println("after wait");

}

}

public static void main(String s[]) {

Object o = new Object();

WaitThread w = new WaitThread(o);

new Thread(w).start();

try {

Thread.sleep(100);

}

catch (InterruptedException e) {


}

System.out.println("before notify");

synchronized (o) {

o.notifyAll();

}

}

}


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚:


before notify

after wait


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ wait(), ΠΊΠ°ΠΊ ΠΈ sleep(), Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ InterruptedException, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ interrupt().

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ рассмотрим Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:


public class ThreadTest implements Runnable {

final static private Object shared=new Object();

private int type;

public ThreadTest(int i) {

type=i;

}

public void run() {

if (type==1 || type==2) {

synchronized (shared) {

try {

shared.wait();

}

catch (InterruptedException e) {


}

System.out.println("Thread "+type+" after wait()");

}

}

else {

synchronized (shared) {

shared.notifyAll();

System.out.println("Thread "+type+" after notifyAll()");

}

}

}

public static void main(String s[]) {

ThreadTest w1 = new ThreadTest(1);

new Thread(w1).start();

try {

Thread.sleep(100);

}

catch (InterruptedException e) {


}

ThreadTest w2 = new ThreadTest(2);

new Thread(w2).start();

try {

Thread.sleep(100);

}

catch (InterruptedException e) {


}

ThreadTest w3 = new ThreadTest(3);

new Thread(w3).start();

}

}


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12.5.


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚:


Thread 3 after notifyAll()

Thread 1 after wait()

Thread 2 after wait()

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12.6.


Рассмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ 1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π²Ρ‹Π·Π²Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ wait() ΠΈ приостановил своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π—Π°Ρ‚Π΅ΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ 2. Π”Π°Π»Π΅Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊ 3.

Π‘Ρ€Π°Π·Ρƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π° сСбя Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΊΡ‚. Π•Ρ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΊ 1 вошСл Π² synchronized -Π±Π»ΠΎΠΊ, Π° стало Π±Ρ‹Ρ‚ΡŒ, установил Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ shared. Но, судя ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, это Π½Π΅ помСшало ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΡƒ 2 Π·Π°ΠΉΡ‚ΠΈ Π² synchronized -Π±Π»ΠΎΠΊ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΡƒ 3. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, для послСднСго это просто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈΠ½Π°Ρ‡Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ "Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ" ΠΏΠΎΡ‚ΠΎΠΊΠΈ 1 ΠΈ 2?

МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° wait(), ΠΎΡ‚ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ всС занятыС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π˜Ρ‚Π°ΠΊ, вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ notifyAll(). Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΠ· wait-set Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Однако Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ исполнСниС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, вСдь ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‚Π°ΠΊΠΆΠ΅ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ synchronized -Π±Π»ΠΎΠΊΠ°!

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ послС Π²Ρ‹Π·ΠΎΠ²Π° notifyAll() всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ сразу Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π›ΠΈΡˆΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… смоТСт Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сСбС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Когда ΠΎΠ½ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ‚ свой synchronized -Π±Π»ΠΎΠΊ ΠΈ отпустит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Если ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн, ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Π°ΠΊ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΠΈ Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° wait(), Π΄Π°ΠΆΠ΅ Ссли Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ notifyAll(). Π’ рассмотрСнном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ смогли Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ wait() с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, ΠΏΠΎ истСчСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ сам попытаСтся Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Но Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΅ΠΌΡƒ придСтся всС Ρ€Π°Π²Π½ΠΎ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ рассмотрСны ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ построСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прилоТСния. Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Π»ΠΈΡΡŒ достоинства ΠΈ нСдостатки Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ – ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ОБ Π½Π΅ выдСляСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСссор ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ примСняСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° time slicing. Π‘Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ†Π΅Π»Π΅ΡΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ запуска Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠžΡΠ½ΠΎΠ²Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² Java ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ интСрфСйс Runnable ΠΈ класс Thread. Π‘ ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… свойства, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… основныС: ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ свойство daemon. Главная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ Π² Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… - ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ -– ΠΊ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Для понимания, ΠΊΠ°ΠΊ Π² Java Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ эта Π·Π°Π΄Π°Ρ‡Π°, Π±Ρ‹Π» сдСлан ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΏΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ памяти Π² JVM, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, нСсмотря Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅, сами ΠΏΠΎ сСбС Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² сигнатурС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ Π±Π»ΠΎΠΊΠ°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΎ, ΠΏΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ освободится.

Новый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ - Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (deadlock), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ программист всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ², Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ Java Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнных срСдств для опрСдСлСния Ρ‚Π°ΠΊΠΎΠΉ ситуации. Π’ Π»Π΅ΠΊΡ†ΠΈΠΈ разбирался ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· "зависания" ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ спСциализированныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Object, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².


13. ЛСкция: ΠŸΠ°ΠΊΠ΅Ρ‚ java.lang

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ рассматриваСтся основная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java – java.lang. Π’ Π½Π΅ΠΉ содСрТатся классы Object ΠΈ Class, классы-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², класс Math, классы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками String ΠΈ StringBuffer, систСмныС классы System, Runtime ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’ этом ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ находятся Ρ‚ΠΈΠΏΡ‹, ΡƒΠΆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ€Π°Π½Π΅Π΅,– для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ситуациями ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ исполнСния.


Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ состав ΠΏΠ°ΠΊΠ΅Ρ‚Π° java.lang входят классы, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ основу для всСх Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΈ поэтому ΠΎΠ½ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΈΠ· всСх, входящих Π² Java API. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π΅Π· Π½Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ класс, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ компиляции содСрТит нСявноС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ этого ΠΏΠ°ΠΊΠ΅Ρ‚Π° ( import java.lang.*; ).

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌ классы, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ основу ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

Object – являСтся ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов.

Class – экзСмпляры этого класса ΡΠ²Π»ΡΡŽΡ‚ΡΡ описаниями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² памяти JVM.

String – прСдставляСт собой ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ строку, содСрТит срСдства Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСю.

StringBuffer – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ (создания) строк.

Number – абстрактный класс, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ супСрклассом для классов-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ числовых ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Java.

Character – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для Ρ‚ΠΈΠΏΠ° char.

Boolean – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для Ρ‚ΠΈΠΏΠ° boolean.

Math – Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… матСматичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Throwable – Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈ, соотвСтствСнно, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠΌ catch, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ унаслСдовано ΠΎΡ‚ Throwable.

Thread – позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ выполнСния Π² Java. Runnable – ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² сочСтании с классом Thread для описания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния.

ThreadGroup – позволяСт ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ дСйствия сразу Π½Π°Π΄ всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² Π½Π΅ΠΉ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ограничСния ΠΏΠΎ бСзопасности Π½Π° манипуляции с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Ρ€ΡƒΠΏΠΏ.

System – содСрТит ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмного уровня.

Runtime – позволяСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ.

Process – прСдставляСт интСрфСйс ΠΊ внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Runtime.

ClassLoader – ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ описания классов Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ JVM.

SecurityManager – для обСспСчСния бСзопасности Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ограничСния Π½Π° Π΄Π°Π½Π½ΡƒΡŽ срСду выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Compiler – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Just-in-Time компиляторов.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹:


Cloneable – Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ планируСтся ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств JVM;

Comparable – позволяСт ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ (ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ этот интСрфСйс.