|
|
|
проблема с synchronized
|
|||
|---|---|---|---|
|
#18+
Господа! Есть многопоточное приложение, обслуживающее поступуающие XMLRPC запросы. Обслуживание каждого клиентского потока происходит в отдельном потоке. Все пришедшие запросы и ответы в текстовом виде кладутся в лог-файл. Собственно, возинкла проблема следующего характера при работе с лог файлом, поскольку приложение многопточное, то каждый трэд сераилизует запрос в лог-файл когда захочет, но поскольку лог файл всегда один, то происходят такие вещи как наложение запросов-ответов, т.е. например в тексте одного запроса может вклинится другой запрос или ответ на запрос. Вроде как пробелма решается с использованием критических секций, объявил я метод, которые серализует запросы-ответы в лог как synchronized. Но это проблему не решило абсолютно. Чего я не понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 09:21 |
|
||
|
проблема с synchronized
|
|||
|---|---|---|---|
|
#18+
Для каждого клиента (потока) создается свой экземпляр объекта с тем самым методом synchronized? Получается, что каждый синхронизируется на своем объекта, а нужно, чтобы все на одном. Например: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 10:03 |
|
||
|
проблема с synchronized
|
|||
|---|---|---|---|
|
#18+
Точно не уверен, но рискну предположить, что у вас для каждого логгируемого запроса создается экземпляр некоего класса, у которого есть synchronized метод (который собственно и пишет в лог). Это действительно не должно работать, ибо экземпляры разные и синхронизация вызова метода между ними не происходит. Все прошло бы гладко, если бы имелся один единственный экземпляр класса, которые логгирует Ваши операции. Тогда все вызовы этого метода происходили бы последовательно и все логгировалось как надо, по-моему. Извините, если не прав. Неплохо было бы взглянуть на код, чтобы понять в чем дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 10:05 |
|
||
|
проблема с synchronized
|
|||
|---|---|---|---|
|
#18+
Да, действительно схема работы выглядит следующим образом: Есть класс Server который для каждого клиентского подключения создает в отдельном потоке класс Worker, это класс который обслуживает запрос и логгирует в текстовый лог. В этом случае необходимо синхронизировать запись в лог на класс Server, т.е. должно быть что то вроде: synchronized(Server.getClass()) { //запись в лог } Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 10:43 |
|
||
|
проблема с synchronized
|
|||
|---|---|---|---|
|
#18+
cooluserДа, действительно схема работы выглядит следующим образом: Есть класс Server который для каждого клиентского подключения создает в отдельном потоке класс Worker, это класс который обслуживает запрос и логгирует в текстовый лог. В этом случае необходимо синхронизировать запись в лог на класс Server, т.е. должно быть что то вроде: synchronized(Server.getClass()) { //запись в лог } Я правильно понял? Да, правильно. Но лучше синхронизироваться не на классе, а создать специально для этого объект. Например, статическое поле Object LOG_LOCK в классе Server. Или подыскать еще что-то подходящее... Почему так лучше? Мало ли для чего еще вы захотите так (на классе) синхронизироваться. В итоге, разные не связанные между собой критические секции будут тормозиться на одном мониторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 11:55 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=725&tid=2149189]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 289ms |
| total: | 391ms |

| 0 / 0 |
