Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Int num; // Номер объекта

// Конструктор

public User (Obj obj, int num)

{

thls.obj= obj;

this.num= num; >

// Потоковая функция

public void run ( )

{

//synchronized (obj) // 2

{

while (obj.getCount ( ) < 5)

{ synchronized (obj) // 1

{

obj.setCount (obj.getCount( )+l); // Увеличить

// счётчик

try

{

Thread.sleep (1); // Поспать

>

catch(InterruptedException e) < }

System.out.println ("User " + num + " count= "

+ obj.getCount( )); >

>

System.out.println ("Thread of User " + num + " finished");

//obj.setCount (0);

>

} >

class SynchronizedTest // Касс с основным потоком

{

public static void maln()

{

Obj obj= new Obj ( ); // Создать разделяемый объект

User usl= new User (obj, 1); // Создать первый объект с потоком

User us2= new User (obj, 2); // Создать второй объект с потоком

usl.start ();

us2.start ();

System.out,println ("0K1"); // Создали объекты

try

{

Thread.sleep (500);

catch(InterruptedException e) { >

System.out.println ("OK2"); //Завершилсяосновнойпоток

>

/>*

Result: Вариант А. Оператор synchronized отсутствует

(строки 1 и 2 закомментированы).

OKl

Userl count= 1

User2 count= 1

Userl count= 3

User2 count= 3

Userl count= 5

Thread of Userl finished

User2 count= 5

Thread of User2 finished

OK2

Result: Вариант Б. Оператор synchronized внутри цикла while охваты-

вает блок, включающий увеличение счетчика, функции Sleep() и

WriteLine().

(строка 1 раскомментирована и строка 2 закомментирована).

OKl

Userl count= 1

User2 count= 2

Userl count= 3

User2 count= 4

Userl count= 5

Thread of Userl finished

User2 count= 6

Thread of User2 finished

OK2

Result: Вариант В. Оператор synchronized охватывает оператор while.

(строка 1 закомментирована и строка 2 раскомментирована).

OKl

Userl count= 1

Userl count= 2

Userl count= 3

Userl count= 4

Userl count= 5

Thread of Userl finished

Thread of User2 finished

OK2

*/

Как подтверждают примеры 9.6.1.1 и 9.6.1.2, отсутствие синхрониза-

ции параллельного выполнения потоков приводит к неуправляемому упот-

реблению разделяемого ими ресурса, поскольку во время применения разде-

ляемого объекта одним потоком этот объект также используется и другим

потоком. Применение оператора lock в языке C# и оператора synchronized в

языке Java блокируют разделяемый ресурс на время его использования каж-

дым потоком.

Рассмотренные в данном разделе операторы lock и synchronized при-

менимы только к одному оператору программы и не позволяют управлять

гибким доступом к разделяемому объекту, что не разрешает ожидающим по-

токам временно изменить свою работу, пока требуемый объект заблокиро-

ван. Для синхронизации параллельного выполнения потоков применяются

классы Mutex и Monitor в языке C# и функции wait(), notify() и notifyAll() в

языке Java, предоставляющие большие возможности. О применении монито-

ра Monitor и функций wait(), notify() и notifyAII() рассказано в следующем

разделе.

9.6.2. Связи между потоками

Если задачи, выполняемые параллельными потоками, независимы, то

каждый из потоков самостоятельно выполняет свою работу, получает надле-

жащий результат и завершается, сообщив, при необходимости, об окончании

работы с помощью события или уведомления.

Но, как правило, параллельные потоки осуществляют совместную ра-

боту, что требует обмен между ними промежуточными данными в процессе

их выполнения. То есть в ряде точек выполнение некоторого потока должно

приостанавливаться (блокироваться), и он должен ждать, когда другой поток

получит результат, требуемый для данного потока, и возобновит его выпол-

нение (разблокирует). Теперь оба потока выполняются опять параллельно,

при этом первый поток берет ожидаемый результат. Так может происходить

обмен данными между многими потоками в требуемых точках их выполне-

ния.

Для обеспечения связи между потоками язык Java использует специ-

альные функции wait(), notify(), notifyAll(), а язык C# - специальные классы

Monitor и Mutex.