I read some java code, and found these functions:
synchronized void setConnected(boolean connected){
this.connected = connected;
}
synchronized boolean isConnected(){
return connected;
}
I wonder if synchronization makes any sense here, or just author didn't understand the need for synchronized keyword?
I'd suppose that synchronized is useless here. Or am I mistaken?
The author has probably designed the code with a multi-threaded approach in mind. This means that the methods are synchronized and more than one thread will not be able to access the synchronized code at the same time on the same object instance.
Synchronization is needed here to prevent memory consistency errors, see http://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html. Though in this concrete case
volatile
would be much more efficient solutionThe keyword
synchronized
is one way of ensuring thread-safety. Beware: there's (way) more to thread-safety than deadlocks, or missing updates because of two threads incrementing an int without synchronization.Consider the following class:
If multiple threads share an instance of
Connection
and one thread callssetConnected(true)
, withoutsynchronized
it is possible that other threads keep seeingisConnected() == false
. Thesynchronized
keyword guarantees that all threads sees the current value of the field.In more technical terms, the
synchronized
keyword ensures a memory barrier (hint: google that).In more details: every write made before releasing a monitor (ie, before leaving a
synchronized
block) is guaranteed to be seen by every read made after acquiring the same monitor (ie, after entering a block synchronizing on the same object). In Java, there's something called happens-before (hint: google that), which is not as trivial as "I wrote the code in this order, so things get executed in this order". Usingsynchronized
is a way to establish a happens-before relationship and guarantee that threads see the memory as you would expect them to see.Another way to achieve the same guarantees, in this case, would be to eliminate the
synchronized
keyword and mark the fieldvolatile
. The guarantees provided byvolatile
are as follows: all writes made by a thread before a volatile write are guaranteed to be visible to a thread after a subsequent volatile read of the same field.As a final note, in this particular case it might be better to use a
volatile
field instead ofsynchronized
accessors, because the two approaches provide the same guarantees and thevolatile
-field approach allows simultaneous accesses to the field from different threads (which might improve performance if thesynchronized
version has too much contention).