简单的例子
自增
int a = 0
ReentrantLock lock = new ReentrantLock()
100.times {
new Thread(new Runnable() {
@Override
void run() {
try {
lock.lock()
a++;
} finally {
lock.unlock()
}
}
}).run()
}
println "a = $a"
与 synchronized 的区别
下面是使用object作为lock实现
int a = 0
def lock = new Object()
100.times {
new Thread(new Runnable() {
@Override
void run() {
synchronized (lock){
a++
}
}
}).run()
}
println "a = $a"
在功能上,ReentrantLock 比 synchronized 多了tryLock,超时,公平调度等额外功能
在native实现上
- synchronized使用了Object中的monitor作为lock,调度通过OS实现(比如pthread_mutex等调用)
- ReentrantLock使用了AQS实现Java层的公平与非公平调度
在Groovy中通过闭包去掉模版代码
参考这里: http://blog.johanneslink.net/2011/10/25/simplified-use-of-locks-in-groovy/