简单的例子

自增

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/