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