On Thu, Jun 7, 2012 at 1:27 AM, Howard Lewis Ship <[email protected]> wrote:
> You can even omit synchronized and volatile IFF:
> - only a single shared field is updated
> - it is ok for a race condition to exist that would create the value
> on multiple threads
> - (I learned this by getting schooled on the subject by Rich Hickey)
>
> There are many things in Tapestry that don't fit this model.
> Sometimes the value being lazily created is so expensive, it would be
> invalid to allow multiple threads to create it. In other cases, more
> than one shared field is updated.
>
Hm, but the second check inside 'synchronized' block is supposed to avoid
creating value on multiple threads. For example:
private volatile Messages messages;
public Messages getMessages()
{
if (messages != null)
{
return messages;
}
synchronized (this) {
if (messages != null)
{
return messages;
}
messages = elementResources.getMessages(componentModel);
// <--- only called if no other thread did this before
}
return messages;
}
Cezary