powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация
14 сообщений из 14, страница 1 из 1
Синхронизация
    #32855589
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая разница между этим
Код: plaintext
1.
2.
3.
4.
5.
 public   void  clear() {
         synchronized  ( this ) {
            ...
        }
 }

и этим

Код: plaintext
1.
2.
3.
 synchronized   public   void  clear() {
         ...
 }

И еще, кто знает, подскажите ссылки с ресурсами в которых описывается многопоточность, синхронизация, создание пулов, кешей и т.д.
...
Рейтинг: 0 / 0
Синхронизация
    #32855617
java script != java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
разница в получаемом байткоде и след-но скорости работы :)
первое точно не хуже, чем второе (JIT может сравнять).
А работает одинаково.
...
Рейтинг: 0 / 0
Синхронизация
    #32855630
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
java script != java
А работает одинаково.

что и требовалось доказать:)
...
Рейтинг: 0 / 0
Синхронизация
    #32936040
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз с этим всем столкнулся и уж окончательно разобрался.
Вот такой способ:

Код: plaintext
1.
2.
3.
 synchronized   public   void  clear() {
         ...
 }
синхронизирует объект класса, но иногда бывает нужно защитить статический кеш в классе и при этом известно, что будет создаваться множество объектов этого класса, тогда на помощь приходит более гибкая конструкция:

Код: plaintext
1.
2.
3.
4.
5.
 public   void  clear() {
         synchronized  ( this .getClass()) {
            ...
        }
 }

можно еще и так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class  Klass{
 private   static  HashMap cache=...
....

 public   void  setData(){
    synchronized (cache){
      //чего нить делаем с кешем
   }
}
}

Только у меня возник еще один вопрос, при создании объекта какого нить класса, выделяется память для нестатических полей, вопрос - кде хранятся все статичестее поля? И еще, со ссылкой this все понятно, а на что указывает вот это - this.getClass(). Работать я с этим всем умею, на уровне подсознания:) но все-таки хочется узнять, как это все в памяти организуется.
...
Рейтинг: 0 / 0
Синхронизация
    #32936593
zhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторкде хранятся все статичестее поля?
Если мне не изменяет память, в с++ они хранятся в "куче" вместе с функциями. Поскольку с - предок явы, то думаю и в ней дело обстоит так же. :)
...
Рейтинг: 0 / 0
Синхронизация
    #32936624
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zhas авторкде хранятся все статичестее поля?
Если мне не изменяет память, в с++ они хранятся в "куче" вместе с функциями. Поскольку с - предок явы, то думаю и в ней дело обстоит так же. :)

Спасибо. Я думаю, что во всех языках именно так дело и обстоит.
...
Рейтинг: 0 / 0
Синхронизация
    #32944762
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в подобных методах:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public   void  getWriteLock()
	{
		 synchronized (mutex)
		{
			waitingWriters++;
			 try 
			{
				 while (givenLocks !=  0 )
				{
					mutex.wait();
				}
			}
			 catch (java.lang.InterruptedException e)
			{
				System.out.println(e);
			}
			
			waitingWriters--;
			givenLocks = - 1 ;
		}
	}

пишут вот так:
Код: plaintext
1.
2.
3.
4.
 while (givenLocks !=  0 )
				{
					mutex.wait();
				}

а не вот так:

Код: plaintext
1.
2.
3.
4.
 if (givenLocks !=  0 )
				{
					mutex.wait();
				}

В чем разница?
...
Рейтинг: 0 / 0
Синхронизация
    #32944792
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что givenLocks могло измениться, пока lock был у другого объекта.
...
Рейтинг: 0 / 0
Синхронизация
    #32944800
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsпотому что givenLocks могло измениться, пока lock был у другого объекта.
так ведь все синхронизированно, и почему while(...), а не If(...), ведь в любом случае проверка произойдет только один раз и потом поток либо попадет в очередь, либо получит блокировку. Ничего не понимаю...
...
Рейтинг: 0 / 0
Синхронизация
    #32944901
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen NotGonnaGetUsпотому что givenLocks могло измениться, пока lock был у другого объекта.
так ведь все синхронизированно, и почему while(...), а не If(...), ведь в любом случае проверка произойдет только один раз и потом поток либо попадет в очередь, либо получит блокировку. Ничего не понимаю...

Ну, представь.
У тебя висит 10 потоков.
В них вызывают метод getWriteLock().

9 из этих потоков заблокированны на mutex (т.к после первого вызова givenLocks=-1).

Разблокирован поток может быть только при условии, что givenLocks == 0.

Допустим не блокированный поток вызвал метод
void freeWriteLock() {
synchronized(mutex){
givenLocks = 0;
mutex.notifyAll();
}
}

После этого вызова 9 методов становяся в очередь на выполнение.
Они начнут работать друг за дружкой, как только особождается mutex.

Но!
Нам этого не нужно. Т.к. метод getWriteLock() служит для получения writeLock'.

Поэтому в первом пробуждённом потоке выставляется givenLocks = -1 и происходит выходит из блока синхронизации.

Тогда выполение переходит к следующему потоку по цепочке.
В нём делается проверка условие, поток понимает, что ему ещё спать-да-спать и вызовется метод mutex.wait().
Аналогично поступят остальные методы.
Если бы у нас было if - все бы они продолжили выполение.

Можно было бы поступить иначе: вместо mutex.notifyAll() в из freeWriteLock() вызвать метод mutex.notify() и заменить while на if. Но тогда нам пришлось бы гарантировать, что при вызове метода notify условие givenLocks !=0 всегда истинно.

Если предположить, что givenLocks отвечает за кол-во ReadLock'ов, то осуществить это будет проблемотично...
...
Рейтинг: 0 / 0
Синхронизация
    #32944907
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому в первом пробуждённом потоке выставляется givenLocks = -1 и происходит выход из блока синхронизации.

Затем выполение переходит к следующему потоку по цепочке.
В нём делается проверка условия, поток понимает, что ему ещё спать-да-спать и вызывает метод mutex.wait().
Аналогично поступают остальные потоки.

Если бы у нас было if, то все потоки возобновили бы свою работу.

Можно было бы поступить иначе: вместо mutex.notifyAll() в методе freeWriteLock() вызвать метод mutex.notify() и заменить while на if.
Но тогда нам пришлось бы гарантировать, что при вызове метода notify условие givenLocks !=0 всегда истинно.

Если предположить, что givenLocks отвечает за кол-во ReadLock'ов, то осуществить это было бы проблематично...

off:
сорри за русский, спать он уходит раньше, чем я :)
...
Рейтинг: 0 / 0
Синхронизация
    #32946191
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После этого вызова 9 методов становяся в очередь на выполнение.
Они начнут работать друг за дружкой, как только особождается mutex.


А с какого места начнут выполнятся эти 9-ть потоков после вызова notifyAll, я думал, что с начала синхронизированного блока или метода, выходит, что нет, он начнет выполнятся после строки mutex.wait()? Если так, то понятно, почему while, а не if. Я прав?
...
Рейтинг: 0 / 0
Синхронизация
    #32946761
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen После этого вызова 9 методов становяся в очередь на выполнение.
Они начнут работать друг за дружкой, как только особождается mutex.


А с какого места начнут выполнятся эти 9-ть потоков после вызова notifyAll, я думал, что с начала синхронизированного блока или метода, выходит, что нет, он начнет выполнятся после строки mutex.wait()? Если так, то понятно, почему while, а не if. Я прав?

Прав.
...
Рейтинг: 0 / 0
Синхронизация
    #32946860
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsПрав.

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


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