Синхронизация нескольких потоков, записывающих в один и тот же файл в Java - PullRequest
1 голос
/ 08 декабря 2010

Конечно, есть очевидный способ использования «синхронизированных».Но я создаю систему, предназначенную для работы на нескольких ядрах и записи в этот файл несколько раз в одну и ту же миллисекунду.Поэтому я считаю, что использование синхронизации сильно ухудшит производительность.Я думал об использовании класса Pipe java (но не уверен, поможет ли это) или о том, чтобы каждый поток записывал в другой файл и дополнительный поток, собирающий эти записи, создавая конечный результат.Я должен отметить, что порядок написания статей не важен, и в любом случае он имеет временную метку.Какова лучшая идея этих двух?есть другие предложения?спасибо.

Ответы [ 4 ]

2 голосов
/ 08 декабря 2010

Использование какой-либо синхронизации (например, одиночных мьютексов) довольно просто реализовать.

Если бы у меня было достаточно ОЗУ, я бы создал какую-то очередь для каждого потока журнала и поток журнала для чтения из всех очередей в циклическом порядке (или что-то в этом роде). вот так).

1 голос
/ 08 декабря 2010

Попробуйте использовать JMS. Все ваши процессы, работающие на разных машинах, могут отправлять сообщения JMS вместо записи в файл. Создайте только один получатель очереди, который получает сообщения и записывает их в файл. Log4J уже имеет эту функциональность: см. JMSAppender.

1 голос
/ 08 декабря 2010

Вы правы, что обеспокоены тем, что не сможете записать все потоки в один и тот же файл без проблем с производительностью.

Когда у меня возникла эта проблема (запись собственной регистрации, задолго до Log4j), я создал два буфера фиксированного размера в памяти, и все потоки производителя записывали в один буфер, в то время как выделенный потребительский поток считывал из другого буфера и записывал в файл. Таким образом, потокам записи приходилось синхронизироваться только при получении и увеличении индекса в буфере и при замене буферов, и он блокировался только при заполнении текущего буфера. Было много памяти, но быстро.

Что касается других идей, вы можете проверить, как работают такие регистраторы, как Log4j и Logback, им пришлось бы решить эту проблему.

1 голос
/ 08 декабря 2010

Не прямой ответ на ваш вопрос, но проект logback имеет встроенные средства синхронизации для записи в один и тот же файл из разных потоков, так что вы можете попробовать использовать его, если вам это нужно, или хотя бы взглянуть на его исходный код. Поскольку он построен для скорости, я уверен, что реализация не будет восприниматься как должное.

...