synchronized { }
Sean Kelly
sean at invisibleduck.org
Wed Jul 30 15:29:24 PDT 2008
Bruno Medeiros wrote:
> Sean Kelly wrote:
>> == Quote from Sean Kelly (sean at invisibleduck.org)'s article
>>> == Quote from torhu (no at spam.invalid)'s article
>>>> Sean Kelly wrote:
>>>>> == Quote from Graham St Jack (graham.stjack at internode.on.net)'s
>>>>> article
>>>>>> On Thu, 26 Jun 2008 08:15:24 -0400, Michel Fortin wrote:
>>>>>>> On 2008-06-25 21:18:41 -0400, Walter Bright
>>>>>>> <newshound1 at digitalmars.com>
>>>>>>> said:
>>>>>>>
>>>>>>>> Right now, if you use a synchronized statement with no argument, it
>>>>>>>> will sync on a mutex unique to that statement.
>>>>>>>>
>>>>>>>> Does anyone write threading code that depends on this behavior?
>>>>>>> I've used it before, thinking it was equivalent to
>>>>>>> synchronize(this) {},
>>>>>>> an incorrect assumption obviously. If you get rid of it, I won't
>>>>>>> miss
>>>>>>> it.
>>>>>> Same.
>>>>> Um, it /is/ equivalent to synchronized(this). What made you think
>>>>> differently?
>>>>>
>>>> Don't the docs say that they're not equivalent?
>>>> http://www.digitalmars.com/d/2.0/statement.html#SynchronizedStatement
>>>> I thought they were the same too, before Walter checked in something to
>>>> phobos that made me think otherwise. Can't remember what exactly.
>>> They're identical, unless something changed recently in D 2.0.
>>> Walter confirmed
>>> this explicitly for me a while back, though I don't have a link handy.
>>
>> I was finally inspired to track down the reference for this statement:
>>
>> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.bugs&artnum=5268
>>
>> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.bugs&artnum=5276
>>
>>
>> The second post from Walter is a reply to my post in the first link.
>> Given
>> this, I can only assume that Walter either misunderstood me or that
>> the behavior
>> was changed silently at some point--I'm pretty sure the latter since I
>> tested
>> this way back when. In any case, the current behavior is as Walter
>> described,
>> and I consider it utterly broken. Not only is it inconsistent with
>> Java, which
>> is what I believe this design was based on, but it's completely
>> useless in the
>> general case. It has to change, but I really wish that the behavior
>> could be
>> fixed in D 1.0 as well. Not likely I know, but oh well.
>>
>>
>> Sean
>
> What do you mean inconsistent with Java? I checked it out now, and
> apparently Java does not have a synchronized statement with no arguments
> (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.19).
See:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#260369
I would consider a synchronized statement with no arguments within a
class member function to synchronize on the same monitor as a
synchronized function in Java. I believe Walter has even said in the
past that 'synchronized' with no arguments is the D equivalent of the
synchronized function label in Java.
> Why is the current behavior broken?
I'm stating that based on Walter's description above where such blocks
will "sync on a mutex unique to that statement." Obviously, the whole
point of synchronization is coordinating the efforts of multiple
concurrent threads. However, in my experience it's unheard of to have a
single function be the means with which shared data is accessed. And
not even a single function in this case, but a single statement. For
example, let's say that we have a linked list that needs synchronization
because we're reading from it and writing to it concurrently. How often
would both the read and write operations be done in the exact same
synchronized statement in code? Right, never.
One could argue that a synchronized statement with no supplied
expression should simply always synchronize on the global monitor, since
that monitor can't be supplied explicitly. However, I would argue that
the correct behavior is to default to the immediate context surrounding
the function. So a class member function would sync on the class
instance, a static class function would sync on the static classinfo,
and a global function would sync on the global monitor. Simple,
straightforward, and it corresponds to the most common use cases for
synchronization.
Sean
More information about the Digitalmars-d
mailing list