To make a method synchronized, simply add the
synchronized
keyword to its declaration:
public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public synchronized int value() { return c; } }
count
is an instance of SynchronizedCounter
, then
making these methods synchronized has two effects:
Note that constructors cannot be synchronized — using the
synchronized
keyword with a constructor is a syntax
error. Synchronizing constructors doesn't make sense, because only the
thread that creates an object should have access to it while it is
being constructed.
List
called
instances
containing every instance of class. You might
be tempted to add the line
instances.add(this);
instances
to access the object before construction of the
object is complete.
Synchronized methods enable a simple strategy for preventing thread
interference and memory consistency errors: if an object is visible to
more than one thread, all reads or writes to that object's variables
are done through synchronized
methods. (An important
exception: final
fields, which cannot be modified after
the object is constructed, can be safely read through non-synchronized
methods, once the object is constructed) This strategy is effective,
but can present problems with liveness, as
we'll see later in this lesson.