Please consider adding (the default) Object.hashCode()
and System.identityHashCode() to the short list of
things that seems immutable to all threads, even in
case of data race:
1. it is the "identity" of the object.
2. without it, java.util.IdentityHashMap can be
broken.
3. it is the last Object() method to protect.
Doron.
--- Doron Rajwan <doron@rajwan.org> wrote:
> 
> It is possible to know exactly when the GC collects
> interned Strings, using System.identityHashCode().
> See
> the following code:
> 
> public class Test {
>     public static void tt() {
>         String s = "aa".concat("bb").intern();
>         System.out.println("code=" + s.hashCode() +
> ";
> sys=" + System.identityHashCode(s));
>     }
>     public static void main(String[] args) throws
> Exception {
>         tt();  // code=2986080; sys=17237886
>         tt();  // code=2986080; sys=17237886
>         System.gc();
>         tt();  // code=2986080; sys=28050664
>         tt();  // code=2986080; sys=28050664
>     }
> }
> 
> Doron.
> 
> 
> --- Thomas Hawtin <thawtin@tackline.demon.co.uk>
> wrote:
> > Eliot Moss wrote:
> > >>>>>>"Doron" == Doron Rajwan <doron@rajwan.org>
> > writes:
> > > 
> > >     Doron> Thread 1, Thread 2:
> > >     Doron>     synchronized ("some string") {
> > >     Doron>         ++a;
> > >     Doron>     }
> > > [...]
> > >     Doron> 2. However, it is possible that the
> > first thread
> > >     Doron> finished, the GC collected the
> interned
> > string, and
> > >     Doron> then, the second thread started. In
> > this case, the
> > >     Doron> sync was on a different instance of
> the
> > String.
> > > 
> > > Doron, I don't get what you're saying. Even a
> > copying GC has to preserve
> > > identity semantics in the face of locking
> objects.
> > And so far as I know, an
> > > interned string will never be reclaimed anyway.
> > 
> > Interned Strings behave as normal garbage (if
> > somewhat slower to be 
> > collected than more typical objects). Early Sun
> JREs
> > (1.0 and 1.1) 
> > failed to collect interned Strings.
> > 
> >
>
http://developer.java.sun.com/developer/bugParade/bugs/4035345.html
> >
>
http://developer.java.sun.com/developer/bugParade/bugs/1240681.html
> > 
> > In the case above, the class' Class will have a
> > reference to the String. 
> > The Class cannot disappear while the method is
> > executing. Therefore, 
> > there is no data race. However you can easily
> create
> > a race using
> > 
> >      synchronized ("some
> > ".concat("string").intern()) {
> > 
> > which would be your own fault.
> > 
> > So synchronising an interned String remains a
> > working way to achieve a 
> > process global critical section. Synchronising on
> a
> > StringBuffer, say, 
> > assigned to a static final field works for a
> class'
> > class loader global 
> > scoped critical section.
> > 
> > Tom Hawtin
> > 
> > -------------------------------
> > JavaMemoryModel mailing list -
> http://www.cs.umd.edu/~pugh/java/memoryModel
> 
> 
> =====
> Doron Rajwan, mailto:doron@rajwan.org
> 
> -------------------------------
> JavaMemoryModel mailing list -
http://www.cs.umd.edu/~pugh/java/memoryModel
=====
Doron Rajwan, mailto:doron@rajwan.org
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:01:05 EDT