
On 31 May 2009, at 17:51, Robert Elliot wrote:
Just as an academic question, what do you think of an architecture where the various debug/info/error etc. calls on Logger all put something like a LoggingEvent (though probably an immutable equivalent) on a blocking queue, and a single thread takes events off the top of the queue and calls the appenders with it?
Then appender calls would be done in a single threaded way, and so an appender implementation would not need to worry about thread safety. ... Would the problem Joern is experiencing with multiple threads competing for a lock and only one of them getting the lock still occur?
I think I can answer my own question at the end there - yes, it might see the same problem if the bounded queue were full and there were multiple threads blocked waiting to log an event - you could see one thread go round and round and round being the only one adding to the queue while all the others sit there, if it were back waiting to log again before the consumer thread had managed to take another event off the top of the queue. But ArrayBlockingQueue can be made fair via a constructor parameter, in which case once the queue is full threads will get to add to it in the order they started waiting to do so and so the problem goes away.