powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / поонятие монитора в синхронизованном блоке
15 сообщений из 15, страница 1 из 1
поонятие монитора в синхронизованном блоке
    #38563972
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в спеке написан пример.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();
 
    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }
 
    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}



Я так понял, что изменение переменной c1 будет мешать одновременному изменению c2, но от чего вообще защищает этот блок я не понимаю.
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563975
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner ,
Что значит "мешать"?
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563976
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner...
Я так понял, что изменение переменной c1 будет мешать одновременному изменению c2Нет не будет...

questioner..., но от чего вообще защищает этот блок я не понимаю. От одновременного изменения защищаемого объекта из разных мест при работе в многопоточных приложениях...

Что такое потоки знаете?
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563986
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНет не будет...

ок ок , ступил

авторЧто такое потоки знаете?

конечно знаю, ноавторОт одновременного изменения защищаемого объекта из разных мест при работе в многопоточных приложениях...

не понятно.

lock1 и lock2 ведь что-то значат
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563987
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторquestioner,
Что значит "мешать"?

каким-то образом влиять, заставлять ждать
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563989
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerне понятно.

lock1 и lock2 ведь что-то значатА что здесь не понятного?
lock1 защищает переменную с1, а lock2 защищает переменную c2...
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563991
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА что здесь не понятного?
lock1 защищает переменную с1, а lock2 защищает переменную c2...

можете показать когда(и на ЧТО) блок ставится и когда снимается и для кого
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38563998
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Вот представьте, по условиям задачи, Вам необходимо чтобы (1) два разных потока могли "одновременно" менять переменные с1 и с2, и (2)нельзя чтобы они могли "одновременно" менять переменную с1 либо с2. Как это сделать?
Естественно, при помощи объектов блокировок. Но использовать один объект блокировки в данном случае нельзя. Потому что не будет выполнено условие 1, при котором потоки могут "одновременно" изменять переменные с1 и с2. Соответственно и применяют столько объектов блокировки сколько необходимо исходя из условий задачи...
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564004
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а когда и для кого лочится секция?

не понмимаю - ведь это вообще сторонняя переменная
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564010
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа когда и для кого лочится секция?

не понмимаю - ведь это вообще сторонняя переменнаясекция блокируется для вызывающей стороны.
Т.е. при "одновременном" исполнении, тот кто чуть позже вызвал будет ждать пока секция не освободится, затем продолжится исполнение.
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564014
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Kuznetsov,

а можете в ващем объяснении указать слова lock1 и lock2 из первого поста?
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564219
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerAlex Kuznetsov,

а можете в ващем объяснении указать слова lock1 и lock2 из первого поста?Не вопрос:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();
 
    public void inc1() {
        synchronized(lock1) // Устанавливается блокировка с использованием объекта lock1
        {
            c1++;
        }
    }
 
    public void inc2() {
        synchronized(lock2) // Устанавливается блокировка с использованием объекта lock2
        {
            c2++;
        }
    }
}

...
public class MyExecution implements Runnable{
   final static MsLunch msLunch = new MsLunch();
   public void run(){
    ...
     msLunch.inc1();
    ...
     msLunch.inc2();
    ...
   }
}

...
  MyExecution thread1 = new MyExecution();...
  Thread th1 = new Thread(thread1,"thread1");
  th1.start();
  
...
  MyExecution thread2 = new MyExecution();...
  Thread th2 = new Thread(thread2,"thread2");
  th2.start();
...
...


когда в потоке th1 (thread1) происходит вызов msLunch.inc1, то устанавливается блокировка с использованием объекта lock1.

Теперь допустим, что код в потоке th2(thread2) также следом вызвал msLunch.inc1. При этом будет произведена попытка установить блокировку опять-же с использованием объекта lock1, НО он уже блокирован, соответственно программа войдёт в режим ожидания до тех пор пока не завершится исполнение метода msLunch.inc1 вызванного из th1 (thread1). По завершении исполнения метода msLunch.inc1 произойдёт разблокировка объекта lock1 и возврат к исполнению msLunch.inc1 вызванного из th2(thread2). Т.е. схематично:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
|-->th1 вызвал  msLunch.inc1();
    |-->msLunch.inc1()(для th1); установлена блокировка использованием lock1 и пошло выполнение кода
|-->th2 вызвал  msLunch.inc1();
             |-->в  msLunch.inc1()(для th2); попытка установить блокировку с использованием lock1 - он к этому времени уже блокирован  - ожидаем разблокировку
    |-->msLunch.inc1()(для th1) закончил работу и освободил объект
             |-->msLunch.inc1()(для th2) установил блокировку и продолжил работу
|-->th1 продолжил работу
             |-->msLunch.inc1()(для th2) закончил работу и освободил объект
|-->th2 продолжил работу


Вот как-то так.
А теперь попробуйте также разрисовать одновременные вызовы inc1 и inc2 из разных потоков, учитывая что они пользуются разными объектами блокировок
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564222
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, следует читать не "соответственно программа войдёт в режим ожидания ", а "соответственно поток th2 войдёт в режим ожидания "
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564247
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, теперь понятно)

была проблема в том, что я не думал, что msLunch будет разделяться между всеми объектами класса.
...
Рейтинг: 0 / 0
поонятие монитора в синхронизованном блоке
    #38564277
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerспасибо, теперь понятно)

была проблема в том, что я не думал, что msLunch будет разделяться между всеми объектами класса.
Пожалуйста.
Вообще-то блокировками защищают любые разделяемые объекты, используемые в многопоточных приложениях. Дабы не было проблем...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / поонятие монитора в синхронизованном блоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]