[hibernate-dev] HSEARCH-189 & concurrency
Emmanuel Bernard
emmanuel at hibernate.org
Fri Jul 4 16:26:01 EDT 2008
Hey,
Can you tell me more about the piggyback synchronization. I could not
find any decent knowledge online.
how far reading a volatile guarantee that all "local" values of the
thread we are reading from will be pushed to the shared memory?
For example, could reading a volatile value after HSearch is done with
initialization (all init is done in a single thread) guarantee that
all states held by this thead will be pushed back to the shared memory?
The use case is quite specific, I init everything in a single thread,
want to push all the state to the shared memory. I know post init()
use of HSearch will never change the state so I don't "need" locking.
--
Emmanuel Bernard
http://in.relation.to/Bloggers/Emmanuel | http://blog.emmanuelbernard.com
| http://twitter.com/emmanuelbernard
Hibernate Search in Action (http://is.gd/Dl1)
On Jul 4, 2008, at 04:33, Sanne Grinovero wrote:
> Hi Pavitar Singh,
>
> I thank you very much about your explanations but actually I opened
> the issue myself
> because I have read the same specs and am aware of that.
> in H.Search (and several other hibernate code) there's this quite
> common pattern for starting
> "replaceable" objects (something like user-written plugins, you can
> provide your own implementation
> to do some stuff) but this same pattern is also used to start the
> built-in default strategies.
>
> It looks like this:
> - an empty constructor, to use class.newInstance();
> - an initialize() to set configuration options
> - a start() method (eventually) used to start background tasks
> - some doStuff() and/or getXX() which need to be fast & threadsafe
>
> As you can see in Concurrecy in Practice at page 50, this is BAD, as
> for
> example in the FSSlaveDirectoryProvider nobody takes care of locking
> or visibility, and nobody is doing anywhere where I see this pattern
> used
> (several times in the project).
> I'm not saying it is all broken, because usually the threads consuming
> these unsafely-initialized objects are started after the
> initialization, so
> that's ok. In this specific case the state will be used to communicate
> between threads, so some visibility fix is needed.
>
> I know I could use it only for final fields, but this is exactly
> what I want:
> there are currently 10 instance variables, of these
> 4 have no concurrent use
> 4 are configuration constants and could use the "final" (they're not
> safely published)
> 2 would need some lock/volatile anyway, bot only one is used
> frequently, so IMHO 1 volatile is ok.
>
> I was thinking in using the same Piggyback technique you mention to
> safely publish the initialization constants,
> but I'm afraid the code will become more difficult to maintain and
> more
> "unreadable", possibly breaking at the first next patch:
> IMHO using some unchanging fields "final" is the most clean and
> readable solution (and best performing), but I need a different
> constructor for that.
>
> your opinion is really welcome as I couldn't find other feedback,
> if you would like to take a look at the sources download the Search
> trunk
> and look at:
> org.hibernate.search.store.FSSlaveDirectoryProvider
> or the FIXME in
> org.hibernate.search.reader.SharingBufferReaderProvider
>
> Sanne
>
> 2008/7/4 Pavitar Singh <pavitar.singh at gmail.com>:
> Hi Sanne,
>
> I don't think moving everything in constructor can guarantee safe
> publication.
>
> From the JMM Specification Section 3.5
>
> "An object is considered to be completely initialized when its
> constructor finishes. A thread that can only see a reference to an
> object after that object has been completely initialized is
> guaranteed to see the correctly initialized values for that object's
> final fields."
>
> That means there are no guarantees for other fields which are non-
> final.
>
> But once things are moved in constructor then by using Safe
> Publication one can enforce visibility guarantees.
>
> Other thing i was wondering was why do one need to make every field
> as volatile. As just by using a single volatile variable one can
> enforce memory barriers. A technique documented in JCIP as Piggyback
> Synchronizations and used by Doug Lea in implementing
> ConcurrentHashMap.(You will find get method in ConcurrentHashMap is
> without any locking and visibility is enforced by use of a single
> volatile variable.)
>
> Also if you can elaborate more on how you are facing the visibility
> issue then may be i can also spend time on it on figuring performant
> solution.
>
> Regards
> Pavitar Singh
> http://pitfalls.wordpress.com
>
> On Fri, Jul 4, 2008 at 5:13 AM, Sanne Grinovero <sanne.grinovero at gmail.com
> > wrote:
> Hello all,
> I'm sorry I've been very busy but as promised I would like to fix
> HSEARCH-189
> (and others) very soon;
>
> I would like to propose a API extension (backwards compatible) that
> would simplify the patch a lot:
> keeping it as is it is very tricky to fix the visibility issues in
> FSSlaveDirectoryProvider
> and FSMasterDirectoryProvider without introducing a performance
> penalty.
>
> I have these options to close the issue:
> 1) add a "volatile" to more than six fields per class (ugly and not
> good for performance)
> 2) use some Locks/synch (more readable, still performance hits)
> 3) move the "initialize" arguments to a constructor.
>
> As Emmanuel knows I would really love the third option, but he's
> worried about
> the fact we can't force a constructor in an interface*1, so my
> proposal is:
>
> if we find there exists a constructor having the same arguments as
> the initialize method,
> we use that, otherwise we use a no-arg constructor and then call the
> initialize.
>
> Reflection is used anyway to instantiate these components,
> the code in DirectoryProviderFactory doesn't get much more complicated
> and much more cleanup is made possible in all DPs because of this
> (as the equals/hashcode comments already ask for).
>
> I actually think this same pattern is needed for other components,
> such as all ReaderProvider, so I hope you'll want to give it a try
> and let me apply it on other components too if you like the
> resulting code.
>
> Sanne
>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>
>
>
>
> --
> Pavitar Singh
> Blog: http://pitfalls.wordpress.com
>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hibernate-dev/attachments/20080704/133797d0/attachment.html
More information about the hibernate-dev
mailing list