Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори JAVA.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.34 Кб
Скачать

47. Оператор synchronized

Хоча створення synchronized методів у ваших класах - простий і ефективний спосіб досягнення синхронізації , все ж він працює не у всіх випадках. Щоб зрозуміти, чому , розглянемо наступне. Припустимо , що ви хочете синхронізувати доступ до об'єктів класів , які не були призначені для багатопотокового доступу . Тобто клас не використовує методів synchronized . Більш того , клас був написаний не вами , а незалежним розробником , і у вас немає доступу до його вихідного коду. Значить , ви не можете додати слово synchronized до оголошення відповідних методів класу. Як може бути синхронізований доступ до об'єктів такого класу? На щастя , існує досить просте рішення цієї проблеми: ви просто укладаєте виклики методів цього класу в блок synchronized .

Ось загальна форма оператора synchronized :

synchronized (об'єкт ) {

/ / Оператори , що підлягають синхронізації}

Тут об'єкт - це посилання на синхронізований об'єкт. Блок synchronized гарантує , що виклик методу - члена об'єкта відбудеться тільки тоді , коли поточний потік успішно увійде в монітор об'єкта.

Нижче показана альтернативна версія попереднього прикладу з використанням синхронізованого блоку всередині методу run ( ) .

/ / Ця програма використовує синхронізований блок .

class Callme {

void call ( String msg ) {

System.out.print ( "[" + msg ) ;

try {

Thread.sleep ( 1000 ) ;}

catch ( InterruptedException e ) {

System.out.println ( " Interrupted " ) ;}

System.out.println ( "]" ) ;}}

class Caller implements Runnable {

String msg ; Callme target ; Thread t ;

public Caller ( Callme targ . String s ) {

target = targ ; msg = s ; t = new Thread ( this ) ; t.start ();

}

/ / Синхронізовані виклики call ( )

public void run () {

synchronized ( target ) {

/ / Синхронізований блок

target.call ( msg ) ;}}}

class Synchl {

public static void main ( String args []) {

Callme target = new Callme ();

Caller obi = new Caller ( target , "Ласкаво просимо" ) ;

Caller ob2 = new Caller ( target , " в синхронізований " ) ;

Caller ob3 = new Caller ( target , " світ !") ;

/ / Wait for threads to end

try { obi.t.join (); ob2 . t . join (); ob3.t.join (); }

catch ( InterruptedException e ) {

System.out.println ( " Перервано " ) ;}}}

Тут метод call ( ) немодифікована словом synchronized . Замість цього використовується оператор synchronized всередині методу run ( ) класу Caller . Це дозволяє отримати той же коректний результат , що і попередній приклад , оскільки кожен потік очікує закінчення виконання свого попередника.

48. Помилки при роботі програми. Виняткові ситуації

При виконанні програми найчастіше можуть виникати помилки. В одних випадках це викликанопомилками програміста , в інших зовнішніми причинами. Наприклад , може виникнути помилка введення / виводу при роботі з файлом або мережевим з'єднанням. У класичних мовах програмування , наприклад в С , було потрібно перевіряти якесь умова яке вказувало на наявність помилки і, залежно від цього робити певні дії .

наприклад

int statusCode = someAction ();

if ( statusCode ) {

 ... Обробка помилки

} else {

Стор. 23 з 51

Програмування на Java

Rendered by www.RenderX.com statusCode = anotherAction ();

 if ( statusCode ) {

  ... Обробка помилки ...

}

}

...

У Java з'явилося більш просте і елегантне рішення - обробка виняткових

ситуацій .

 

try {

 someAction ();

 anotherAction ( )

} catch ( Exception e ) {

 ... Обробка виняткової ситуації

}

Легко помітити , що такий підхід є не тільки елегантним , але і більш надійним

і простим для розуміння.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]