This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Re: Possible hash synchronization bug exposed by AWT?
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: Jacob Gladish <jake at gladish dot info>
- Cc: hans dot boehm at hp dot com, java at gcc dot gnu dot org
- Date: Fri, 23 Jul 2004 21:48:13 -0400
- Subject: Re: Possible hash synchronization bug exposed by AWT?
- References: <006901c46fff$2020a350$a711620a@hq.netapp.com>
Jacob Gladish wrote:
I've seen that exact same thing a couple times before. I really couldn't
figure out what was going on. This is why I thought there may be some
type of race condition in the hash sync code, which is what motivated me
to write that test case which ended up revealing the deadlock that Hans
identified.
Interesting. Are you seeing the bug on a multiprocessor/hyperthreading
system? I don't suppose you have been able to come up with a test case
to easily reproduce it? :)
I have since rebuilt the environment with hash sync off. On another
note, I actually witnessed something interesting. The initial theory was
that my test was going to be significantly slower with hash sync off
because of the heavy use of java.util.Vector (everything is
synchronized), but the test with hash sync off was actually much faster.
I don't think hash synchronization was ever claimed to be faster than
standard synchronization. Rather, the advantage is that no
synchronization field is required in every object. This saves 1 word per
object, which can be quite significant in the context of a large
application. The idea is that any extra overhead from the hash
synchronization is more than made up for in performance improvements due
to better cache locality, etc.
It is a bit worrying, however, if you are seeing significant performance
degradation from using hash synchronization. Do you have a test
case/benchmark that demonstrates this?
I think Hans is on vacation right now, hopefully when he gets back he'll
be able to offer some insight.
The only thing I have come up with for this is that threads where
sleeping in monitor enter when attempting to acquire a lightweight lock
which was already in the heavyweight state. This may be completely
inaccurate since I never confirmed that if the lock was already in the
heavyweight state whether the thread entered the spin/sleep loop.
It did seem like the runtime performed better with hash sync off when
the application experiences lots of lock contention.
The common assumption is that in real-world applications, uncontended
locks are by far the common case, and thus its better to optimize for
no-contention locks even if it means that things are slower in the
contented case. I admit to being suspicious as to the merits of
spinning, however.
Regards
Bryce