|
|
|
Threads и locking при synchronized
|
|||
|---|---|---|---|
|
#18+
Такой вопрос. Есть простенький код: Код: plaintext 1. 2. 3. 4. 5. Это аналогично такому: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Мне непонятно. Во втором случае явно лочим объект. А не класс. В первом случае исходя из Сановской доки: http://java.sun.com/docs/books/tutorial/essential/threads/monitors.html A critical section can be a block or a method and is identified with the synchronized keyword. The Java platform associates a lock with every object and the lock is acquired when a critical section is entered. Лочатся все объекты этого класса. Что же происходит в случае synchronized (ClassName.class) ? Я знаю что так надо делать в случае когда надо залочить (сайнхронайзить) доступ к статикам в классе. Таки тут все не очень однозначно для меня. Кто подскажет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 21:44 |
|
||
|
Threads и locking при synchronized
|
|||
|---|---|---|---|
|
#18+
все просто, если вы испльзуете синхорнизацию для class members, то thread приобретает lock класса, если вы используете синхронизацию instance member то thread приобретает lock экземпляра класса. В преведенных вами премерах разница будет в том что в первом случае thread приобретет lock обьекта сразу при вызове метода. Во втором случае немного сложнее. Здесь любой thread сможет вызвать метод (поскольку на данном этапе не один из threads не владеет lock обьекта), но как только какой нибудь thread войдет в critical section он приобретет лок обьекта. Данный вариант дает вам больше гибкости поскольку позволяет помешать внутрь critical section только необходимые операции а не весь метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2006, 00:17 |
|
||
|
Threads и locking при synchronized
|
|||
|---|---|---|---|
|
#18+
Андромедо http://java.sun.com/docs/books/tutorial/essential/threads/monitors.html A critical section can be a block or a method and is identified with the synchronized keyword. The Java platform associates a lock with every object and the lock is acquired when a critical section is entered. Лочатся все объекты этого класса. Я так понимаю, это трудности перевода. "The Java platform associates a lock with every object". Здесь говорится не о том, что при входе в критическую секцию лочатся все объекты данного класса, а о том, что у каждого объекта есть своя собственная блокировка (то, что обычно в документации зовется монитором). Короче, с каждым объект асоциируется свой монитор. "the lock is acquired when a critical section is entered". А это о том, что при входе в критическую секцию, блокировка устанавливается на мониторе того объекта, с которым ассоциирована критическая секция. При этом лочится только один объект. Андромедо Что же происходит в случае synchronized (ClassName.class) ? ClassName.class - это тоже объект (типа Class). А раз так, то у него тоже есть монитор, на котором можно установить блокировку; при этом ни один экземпляр типа ClassName не блокируется. Андромедо Я знаю что так надо делать в случае когда надо залочить (сайнхронайзить) доступ к статикам в классе. Вообще, суть блокировки в том, что в каждый момент времени монитором объекта может владеть только один поток (или ни одного). Когда речь идет о статических методах, самым подходящим оказывается объект ClassName.class. Но в принципе, это может быть любой другой объект. Например, где-то в моем коде была специальная переменная для каких-то специфических блокировок (уже не помню, что именно): Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2006, 00:17 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33699114&tid=2149414]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 447ms |

| 0 / 0 |
