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

Есть многопоточное приложение, обслуживающее поступуающие XMLRPC запросы. Обслуживание каждого клиентского потока происходит в отдельном потоке. Все пришедшие запросы и ответы в текстовом виде кладутся в лог-файл.

Собственно, возинкла проблема следующего характера при работе с лог файлом, поскольку приложение многопточное, то каждый трэд сераилизует запрос в лог-файл когда захочет, но поскольку лог файл всегда один, то происходят такие вещи как наложение запросов-ответов, т.е. например в тексте одного запроса может вклинится другой запрос или ответ на запрос.

Вроде как пробелма решается с использованием критических секций, объявил я метод, которые серализует запросы-ответы в лог как synchronized. Но это проблему не решило абсолютно.

Чего я не понимаю?
...
Рейтинг: 0 / 0
проблема с synchronized
    #33741719
Для каждого клиента (потока) создается свой экземпляр объекта с тем самым методом synchronized? Получается, что каждый синхронизируется на своем объекта, а нужно, чтобы все на одном. Например:
Код: plaintext
1.
2.
3.
4.
5.
 void  log(String msg) {
     synchronized  ( this . class ) {
        ...  //запись в лог-файл
    }
}
...
Рейтинг: 0 / 0
проблема с synchronized
    #33741726
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно не уверен, но рискну предположить, что у вас для каждого логгируемого запроса создается экземпляр некоего класса, у которого есть synchronized метод (который собственно и пишет в лог). Это действительно не должно работать, ибо экземпляры разные и синхронизация вызова метода между ними не происходит.

Все прошло бы гладко, если бы имелся один единственный экземпляр класса, которые логгирует Ваши операции. Тогда все вызовы этого метода происходили бы последовательно и все логгировалось как надо, по-моему.

Извините, если не прав. Неплохо было бы взглянуть на код, чтобы понять в чем дело.
...
Рейтинг: 0 / 0
проблема с synchronized
    #33741844
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действительно схема работы выглядит следующим образом:

Есть класс Server который для каждого клиентского подключения создает в отдельном потоке класс Worker, это класс который обслуживает запрос и логгирует в текстовый лог.

В этом случае необходимо синхронизировать запись в лог на класс Server, т.е. должно быть что то вроде:

synchronized(Server.getClass())
{
//запись в лог
}

Я правильно понял?
...
Рейтинг: 0 / 0
проблема с synchronized
    #33742117
cooluserДа, действительно схема работы выглядит следующим образом:

Есть класс Server который для каждого клиентского подключения создает в отдельном потоке класс Worker, это класс который обслуживает запрос и логгирует в текстовый лог.

В этом случае необходимо синхронизировать запись в лог на класс Server, т.е. должно быть что то вроде:

synchronized(Server.getClass())
{
//запись в лог
}

Я правильно понял?
Да, правильно.

Но лучше синхронизироваться не на классе, а создать специально для этого объект. Например, статическое поле Object LOG_LOCK в классе Server. Или подыскать еще что-то подходящее...

Почему так лучше? Мало ли для чего еще вы захотите так (на классе) синхронизироваться. В итоге, разные не связанные между собой критические секции будут тормозиться на одном мониторе.
...
Рейтинг: 0 / 0
проблема с synchronized
    #33742138
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за разъяснения, буду разбираться
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема с synchronized
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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