PicoContainer

# About

- What is PicoContainer?
- Introduction
- Javadoc
- Downloads
- News
- FAQ
- Project Goals
- Support

# Core Concepts

- Component Lifecycle
- Dependency Injection
- Scoped Containers

# Dependency Injection

- Constructor Injection
- Setter Injection
- Annotated Field Injection
- Annotated Method Injection
- Typed Field Injection
- Named Field Injection
- Method Injection
- Multiple Injection
- Composite Injection
- Factory Injection
- Reinjection
- Injection via Providers

# Configuration

- Disambiguation

# Modifying Component Behaviors

- Modifying Behaviors
- Caching and Singletons
- Hiding Implementations
- Thread Safety Behaviors
- AOP Style Interception

# Advanced Concepts

- Fluent Style
- Arrays, Collections and Maps
- Leveraging Parameter Names
- Building Containers
- Component Properties
- Component Configuration
- Monitoring Component Events

# PicoContainer's Architecture

- Design Patterns
- Inversion of Control
- Component Adapters
- Mock Objects
- Terminology
- Container Comparisons
- Transparency

# Container Choices

- DefaultPicoContainer
- CommandLinePicoContainer
- PropertiesPicoContainer
- SystemPropertiesPicoContainer
- TransientPicoContainer
- TieringPicoContainer

# Dependant & Related

- Web Frameworks
- Scripting Support
- Persistence
- Logging

# Anti-patterns

- Propagating Dependency
- Long Constructor Argument List
- Container Dependency
- Unit Tests Use Container
- Singleton

# Help Pages

- Ambiguous Injectable
- Unprocessed Properties

# History

- Inversion of Control History

# Project Info

- Project
- Team

# Hosted by

# Tools

## Thread Safety Behaviors

## Thread Safety

When components are created by two threads concurrently, with the intention of the instance being cached, it is possible in a small percentage of cases for the first instance into the cache to be replaced with a second instance. To prevent this, you may want to try one of two behaviors to make the operation thread safe.

### Synchronizing

Synchronizing wraps object creation in Java's classic synchronize feature:

    pico = new DefaultPicoContainer(new Synchronizing().wrap(new Caching()));
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    pico = new DefaultPicoContainer();
    pico.as(SYNCHRONIZE, CACHE).addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    pico = new PicoBuilder().withSynchronizing().withCaching().build();
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    import static org.picocontainer.behaviors.Behaviors.synchronizing;
    import static org.picocontainer.behaviors.Behaviors.caching;
    ...
    pico = new PicoBuilder().withBehaviors(synchronizing(), caching()).build();
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

### Locking

Locking wraps object creation in JDK 1.5's ReentrantLock facility. It is suggested that this is a more efficient alternative to the Synchronizing behaviour above:

    pico = new DefaultPicoContainer(new Locking().wrap(new Caching()));
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    pico = new DefaultPicoContainer();
    pico.as(LOCK, CACHE).addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    pico = new PicoBuilder().withLocking().withCaching().build();
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance

    import static org.picocontainer.behaviors.Behaviors.locking;
    import static org.picocontainer.behaviors.Behaviors.caching;
    ...
    pico = new PicoBuilder().withBehaviors(synchronizing(), caching()).build();
    pico.addComponent(Apple.class);
    Apple a1 = pico.getComponent(Apple.class);
    Apple a2 = pico.getComponent(Apple.class);
    // both the same instance