Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / поонятие монитора в синхронизованном блоке / 15 сообщений из 15, страница 1 из 1
18.02.2014, 09:58
    #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
18.02.2014, 10:03
    #38563975
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поонятие монитора в синхронизованном блоке
questioner ,
Что значит "мешать"?
...
Рейтинг: 0 / 0
18.02.2014, 10:03
    #38563976
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поонятие монитора в синхронизованном блоке
questioner...
Я так понял, что изменение переменной c1 будет мешать одновременному изменению c2Нет не будет...

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

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

ок ок , ступил

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

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

не понятно.

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

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

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

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

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

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

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

а можете в ващем объяснении указать слова lock1 и lock2 из первого поста?
...
Рейтинг: 0 / 0
18.02.2014, 12:06
    #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
18.02.2014, 12:07
    #38564222
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поонятие монитора в синхронизованном блоке
сорри, следует читать не "соответственно программа войдёт в режим ожидания ", а "соответственно поток th2 войдёт в режим ожидания "
...
Рейтинг: 0 / 0
18.02.2014, 12:19
    #38564247
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поонятие монитора в синхронизованном блоке
спасибо, теперь понятно)

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

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


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