A Simple Lock
Let's start out by looking at a synchronized block of Java code:
public class Counter{ private int count = 0; public int inc(){ synchronized(this){ return ++count; } } }
Notice the
synchronized(this)
block in the inc()
method. This block makes sure that only one thread can execute the return ++count
at a time. The code in the synchronized block could have been more advanced, but the simple ++count
suffices to get the point across.
The
Counter
class could have been written like this instead, using a Lock
instead of a
synchronized block:
public class Counter{ private Lock lock = new Lock(); private int count = 0; public int inc(){ lock.lock(); int newCount = ++count; lock.unlock(); return newCount; } }
The
lock()
method locks the Lock
instance so that all threads calling lock()
are blocked until unlock()
is executed.
Here is a simple
Lock
implementation:public class Lock{ private boolean isLocked = false; public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } isLocked = true; } public synchronized void unlock(){ isLocked = false; notify(); } }
Notice the
while(isLocked)
loop, which is also called a "spin lock"
No comments:
Post a Comment