[dmd-concurrency] synchronized, shared, and regular methods inside the same class

Andrei Alexandrescu andrei at erdani.com
Mon Jan 4 06:46:14 PST 2010


This may be easiest to answer for people with extensive experience with 
Java's threading model. Consider the following D code:

class A {
     void foo() synchronized;
     void bar() shared;
     void baz();
}

If we have an object of type A, all three methods are callable. If we 
have an object of type shared(A), baz() is not callable. There is a 
remaining problem with foo() and bar(): the first uses lock-based 
synchronization, the second uses a sort of free threading (e.g. 
lock-free) that the compiler is unable to control. It follows that calls 
to foo() and bar() from different threads may easily create race conditions.

I think the compiler should enforce that a class either defines 
synchronized methods, shared methods, but not both. So the class writer 
must decide upfront whether they use lock-based or lock-free threading 
with a given class. Does this make sense? Is it too restrictive?

Walter asked - what if we take this one step further and force a class 
to define _all_ methods either synchronized, shared, or neither? In that 
case the keyword could be moved to the top:

shared class A { ... all methods shared ... }
synchronized class B { ... all methods synchronized ... }
class C { ... shared/synchronized not allowed ... }

Has experience with Java shown that it's best to design classes for 
concurrency in separation from single-threaded classes? Effective Java 
doesn't mention that. But then there are all these methods 
synchronizedCollection, synchronizedList etc. that wrap the 
corresponding collections (which probably don't have synchronized 
methods). I'm reading this up, but if there's someone on this list who 
could save us all some time, please chime in.


Thanks,

Andrei


More information about the dmd-concurrency mailing list