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.