Re: "Lock" on object - Synchronized keyword
Vikram wrote:
What does this mean ? Does it mean that when a thread is invoking
method "bar", no other thread can make changes to any public static
member of the class and no other method can be invoked ?
No. It's a "synchronization lock", not a "read-write lock."
If thread A does this:
synchronized( lockedObject ) {
...
Then thread B does this
lockedObject.add( foo );
there is no lock, thread B adds foo without blocking. If you want
thread B to block, you have to do this:
List newList = Collections.synchronizedList( lockedObject );
synchronized( newList ) {
... // Thread A
Now, when thread B runs, the result is
newList.add( foo ); // Note, gotta use the new object
...
public boolean add( Object o ) { // Inside newList now
synchronize( this ); // Thread B stops here
Now thread B will block because thread A has a lock and the new
synchronized add() method also takes the lock. (It might actually be
implemented differently in a synchronized List, I just made it a
separate line because it was shorter for email.)
(Also, it depends on the locking policy of the object. Synchronized
lists actually do lock the their object, and the docs say this, so I
know I can take that lock and thread B will block. Review the Java doc
for List.)
Synchronization locks are not read-write locks, but they can be used to
implement read-write locks. That's what the sychonizedList gives --
read-write locks -- and my little example shows one way it might
implement that r/w lock.