> -----Original Message-----
> From: Christopher Schultz [mailto:ch...@christopherschultz.net]
> Sent: Thursday, May 31, 2012 5:23 PM
> 
> 
> Yup: the solution is to just synchronize all the methods. If restart() is
> synchronized, it will only operate while other methods are not actively
> checking-out or checking-in connections. The big problem with the concept
> of a "restart" is that there could be connections that are currently checked-
> out during the call to recycle()... those need to be handled in some special
> way -- probably added to a queue that will be processed later to destroy the
> connections.
> 

That's what I will submit to commons-dbcp, then.

> On the one hand, synchronizing these methods should not be necessary
> because Java boolean values are defined to be 32-bit integers which feature
> atomic assignment (that is, no thread ever sees only 8-bits of the 32-bit 
> value
> being assigned and 24-bits of the old value). On the other hand, threads are
> allowed to keep cached copies of certain data under certain conditions. Using
> the keyword 'volatile' /should/, in recent JVMs, make the use of
> 'synchronized' completely unnecessary, while older JVMs may even ignore
> 'volatile' making 'synchronized'
> mandatory. Use of 'synchronized' is the safest bet because it definitely
> causes a 'memory barrier' to be crossed in any version of
> JVM: that means that the thread is required to synchronize (perhaps a bad
> choice of words) its cache with main memory which means that all variables
> get the latest copies of the "real" data.

Yep.  That was my point too.  What does it really matter anyway whether you are 
able to lock "this" in a getter.   When you ask for the value, you are just 
asking for what is current.  You have to protect yourself from 
non-initialized/null in any case.  It just adds some unnecessary overhead ( to 
the JVM and brain ) to synchronize your getter when it doesn't mutate the data 
- unless I am missing something.

--Brooke

Reply via email to