Потерял кучу времени, просто пытаясь понять, что здесь происходит, но я думаю, что, наконец, я что-то наделал.Может ли кеширование PicoContainer быть потокобезопасным?
У нас есть довольно нормальный код PicoContainer который просто превращает кэширование, которое я думал, что должен был привести к одноплодной поведения:
container.as(Characteristics.CACHE).addComponent(Service.class, ServiceImpl.class);
Однако, как мы обнаружили сегодня, у нас есть компонент, который, по-видимому строящимся не один раз, а четыре раза. Это не то, что я могу воспроизвести на своем собственном компьютере, как раз на некоторых других машинах-разработчиках.
Мы исследовали дальше, и выяснилось, что несколько потоков поражали PicoContainer, чтобы одновременно искать один и тот же компонент, а вместо экземпляра одной копии и ожидания остальных трех потоков, кажется, что она просто создает четыре (а затем помнит только один из них).
Есть ли относительно простой способ получить истинное сингулярное поведение в PicoContainer?
Просто немного посмертного для этого - это действительно исправило проблему для человека, у которого было это, и также зафиксировал все те тесты, которые мы написали, по крайней мере, в краткосрочной перспективе. В более долгосрочной перспективе, 1 из 10 000 раз тест выполняется, PicoContainer все еще создает несколько экземпляров компонента. Поэтому я бы сказал, что он по-прежнему не является потокобезопасным даже при использовании поведения блокировки, он несколько лучше, чем не использует его. – Trejkaz
Правда. Думаю, [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
Я думал, что могу просто вникнуть в то, как работает PicoContainer, а затем попытаться использовать некоторые средства параллелизма Guava, чтобы сделать поистине нитевидный компонентный адаптер. – Trejkaz