You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by Ed Slavich <ed...@justappraised.com> on 2022/01/16 23:33:29 UTC

Do instance variables set in @PostConstruct need volatile?

Hello,

When a bean instance variable is set in a @PostConstruct method, does the variable need to be declared volatile?  For example:

@Stateless
public class SomeBean {
    private volatile Foo foo;

    @PostConstruct
    private void initialize() {
        foo = new Foo();
    }
}

Or does TomEE provide some sort of guarantee that makes volatile unnecessary?

Thanks,
Ed

Re: Do instance variables set in @PostConstruct need volatile?

Posted by Jean-Louis Monteiro <jl...@tomitribe.com>.
Not sure I get all of it, but in essence the container maintains a pool of
Stateless instances.
Whenever you do an invocation on a Stateless bean, the container borrows an
instance out of the pool. If no instance is available, the container can
lazily create a one-time usage bean, or wait until an instance becomes
available.

Whatever happens, the instance offered by the container to perform the
invocation can't be simultaneously used.
Similarly for the lifecycle methods such as @PostConstruct or @PreDestroy

Of course, this is for stateless session beans. For singleton beans, a
method can be simultaneously called by multiple threads.

Hope it helps
--
Jean-Louis Monteiro
http://twitter.com/jlouismonteiro
http://www.tomitribe.com


On Sun, Jan 30, 2022 at 5:42 PM Ed Slavich <ed...@justappraised.com>
wrote:

> Hi Jean-Louis, thanks for your reply.  Here's a concrete example:
>
> @Stateless
> public class QuartzService {
>     @Inject
>     private ServletContext servletContext;
>
>     private volatile Scheduler scheduler;
>
>     @PostConstruct
>     public void initialize() {
>         scheduler = getScheduler();
>     }
>
>     private Scheduler getScheduler() {
>         try {
>             return ((StdSchedulerFactory) servletContext.getAttribute(
>                     QuartzInitializerListener.QUARTZ_FACTORY_KEY)
>             ).getScheduler();
>         } catch (final Exception e) {
>             throw new RuntimeException("Failed to obtain instance of
> Quartz Scheduler", e);
>         }
>     }
> }
>
> We need to wait until the ServletContext is available before retrieving
> the scheduler, but since I'm assigning a variable in a multithreaded
> environment I'm not sure if there will be memory visibility issues, or if
> TomEE has some way of making sure that the bean's variables are
> synchronized before putting it into service.
>
> -- Ed
>
> > On Jan 24, 2022, at 3:42 AM, Jean-Louis Monteiro <
> jlmonteiro@tomitribe.com> wrote:
> >
> > Hi,
> >
> > What's the goal?
> > What are you trying to solve with it?
> > --
> > Jean-Louis Monteiro
> > http://twitter.com/jlouismonteiro
> > http://www.tomitribe.com
> >
> >
> > On Mon, Jan 17, 2022 at 12:33 AM Ed Slavich <
> ed.slavich@justappraised.com>
> > wrote:
> >
> >> Hello,
> >>
> >> When a bean instance variable is set in a @PostConstruct method, does
> the
> >> variable need to be declared volatile?  For example:
> >>
> >> @Stateless
> >> public class SomeBean {
> >>    private volatile Foo foo;
> >>
> >>    @PostConstruct
> >>    private void initialize() {
> >>        foo = new Foo();
> >>    }
> >> }
> >>
> >> Or does TomEE provide some sort of guarantee that makes volatile
> >> unnecessary?
> >>
> >> Thanks,
> >> Ed
>
>

Re: Do instance variables set in @PostConstruct need volatile?

Posted by Ed Slavich <ed...@justappraised.com>.
Hi Jean-Louis, thanks for your reply.  Here's a concrete example:

@Stateless
public class QuartzService {
    @Inject
    private ServletContext servletContext;

    private volatile Scheduler scheduler;

    @PostConstruct
    public void initialize() {
        scheduler = getScheduler();
    }

    private Scheduler getScheduler() {
        try {
            return ((StdSchedulerFactory) servletContext.getAttribute(
                    QuartzInitializerListener.QUARTZ_FACTORY_KEY)
            ).getScheduler();
        } catch (final Exception e) {
            throw new RuntimeException("Failed to obtain instance of Quartz Scheduler", e);
        }
    }
}

We need to wait until the ServletContext is available before retrieving the scheduler, but since I'm assigning a variable in a multithreaded environment I'm not sure if there will be memory visibility issues, or if TomEE has some way of making sure that the bean's variables are synchronized before putting it into service.

-- Ed

> On Jan 24, 2022, at 3:42 AM, Jean-Louis Monteiro <jl...@tomitribe.com> wrote:
> 
> Hi,
> 
> What's the goal?
> What are you trying to solve with it?
> --
> Jean-Louis Monteiro
> http://twitter.com/jlouismonteiro
> http://www.tomitribe.com
> 
> 
> On Mon, Jan 17, 2022 at 12:33 AM Ed Slavich <ed...@justappraised.com>
> wrote:
> 
>> Hello,
>> 
>> When a bean instance variable is set in a @PostConstruct method, does the
>> variable need to be declared volatile?  For example:
>> 
>> @Stateless
>> public class SomeBean {
>>    private volatile Foo foo;
>> 
>>    @PostConstruct
>>    private void initialize() {
>>        foo = new Foo();
>>    }
>> }
>> 
>> Or does TomEE provide some sort of guarantee that makes volatile
>> unnecessary?
>> 
>> Thanks,
>> Ed


Re: Do instance variables set in @PostConstruct need volatile?

Posted by Jean-Louis Monteiro <jl...@tomitribe.com>.
Hi,

What's the goal?
What are you trying to solve with it?
--
Jean-Louis Monteiro
http://twitter.com/jlouismonteiro
http://www.tomitribe.com


On Mon, Jan 17, 2022 at 12:33 AM Ed Slavich <ed...@justappraised.com>
wrote:

> Hello,
>
> When a bean instance variable is set in a @PostConstruct method, does the
> variable need to be declared volatile?  For example:
>
> @Stateless
> public class SomeBean {
>     private volatile Foo foo;
>
>     @PostConstruct
>     private void initialize() {
>         foo = new Foo();
>     }
> }
>
> Or does TomEE provide some sort of guarantee that makes volatile
> unnecessary?
>
> Thanks,
> Ed