2012-02-29 3 views
0

Потерял кучу времени, просто пытаясь понять, что здесь происходит, но я думаю, что, наконец, я что-то наделал.Может ли кеширование PicoContainer быть потокобезопасным?

У нас есть довольно нормальный код PicoContainer который просто превращает кэширование, которое я думал, что должен был привести к одноплодной поведения:

container.as(Characteristics.CACHE).addComponent(Service.class, ServiceImpl.class); 

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

Мы исследовали дальше, и выяснилось, что несколько потоков поражали PicoContainer, чтобы одновременно искать один и тот же компонент, а вместо экземпляра одной копии и ожидания остальных трех потоков, кажется, что она просто создает четыре (а затем помнит только один из них).

Есть ли относительно простой способ получить истинное сингулярное поведение в PicoContainer?

ответ

2

Кажется, что pico-container нуждается в явном механизме синхронизации для случая, с которым вы имеете дело. Here is a link, который документирует это поведение и предлагает решения для них.

Процитирует эту ссылку

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

Другая ссылка, которую стоит посетить, касается caching;

+0

Просто немного посмертного для этого - это действительно исправило проблему для человека, у которого было это, и также зафиксировал все те тесты, которые мы написали, по крайней мере, в краткосрочной перспективе. В более долгосрочной перспективе, 1 из 10 000 раз тест выполняется, PicoContainer все еще создает несколько экземпляров компонента. Поэтому я бы сказал, что он по-прежнему не является потокобезопасным даже при использовании поведения блокировки, он несколько лучше, чем не использует его. – Trejkaz

+0

Правда. Думаю, [Double Check lock] (http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) может еще больше уменьшить вероятность появления нескольких экземпляров. В частности, JDK5 с улучшенной [моделью памяти] (http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html). – Santosh

+0

Я думал, что могу просто вникнуть в то, как работает PicoContainer, а затем попытаться использовать некоторые средства параллелизма Guava, чтобы сделать поистине нитевидный компонентный адаптер. – Trejkaz

Смежные вопросы