On 20/05/2013 5:44 PM, David Holmes wrote:
On 20/05/2013 4:25 PM, Martin Buchholz wrote:
Note that my pending change
http://cr.openjdk.java.net/~martin/webrevs/openjdk8/getChars/getChars.patch

does the same kind of thing, but without recursive lock acquisitions.

I will take a look.

So it looks like I can do my push with nested sync with no concern because once you do your getChars update the nested sync will be removed. I like that outcome.

That said I'm concerned by your getChars method but I shall take that up on another thread.

Thanks,
David

I'm curious why a recursive lock acquisition would be considered "very"
cheap.  Is there some hotspot magic, or is it simply that we have
another write to a cache line that is already probably owned by the cpu
by virtue of the previous cas to acquire?

Yes "hotspot magic". Acquiring a lock you already own doesn't require a
CAS; and if it is locked via biased-locking then it is an even shorter
path.

Thanks,
David


On Sun, May 19, 2013 at 10:48 PM, David Holmes <david.hol...@oracle.com
<mailto:david.hol...@oracle.com>> wrote:

    The change put through for JDK-8013395 (StringBuffer toString cache)
    has exposed a previously unnoticed bug in the
    StringBuffer.append(__CharSequence cs) method. That method claimed
    to achieve synchronization (and then correct toStringCache
    behaviour) by the super.append method calling other StringBuffer
    methods after narrowing of cs to a specific type. But that is
    incorrect if cs==null as in that case the
    AbstractStringBuilder.__appendNull method is called directly, with
    no calls to an overridden StringBuffer method. (I have verified that
    none of the other methods claiming to not need sync suffer from a
    similar flaw - this is an isolated case.)

    Consequently we started failing some existing append(null) tests.

    The fix is quite simple: append(CharSequence) behaves as for other
    append methods and is declared synchronized and clears the cache
    explicitly. The existing test is extended to check append(null).

    webrev:

    http://cr.openjdk.java.net/~__dholmes/8014814/webrev/
    <http://cr.openjdk.java.net/~dholmes/8014814/webrev/>

    This fix does mean that recursive synchronization will now be used
    for append(CharSequence) but recursive synchronization is very
    cheap. An alternative fix suggested by Alan Bateman in the bug
    report is to override appendNull and add the synchronization there.
    That requires a change to the accessibility of
    AbstractStringBuilder.__appendNull so I chose the more constrained
    fix. Alan's fix will also introduce nested synchronization, but only
    for the append(null) case. As I said I don't think performance will
    be a concern here.

    Testing (in progress): JPRT -testset core, SQE test that caught this

    Thanks,
    David


Reply via email to