上篇讲了使用synchronized关键字来定义锁,其实Java除了使用这个关键字外还可以使用Lock接口及其实现的子类来定义锁,ReentrantLock类是Lock接口的一个实现,Reentrant是“重入”的意思,因此这个锁也是支持重入的,这里就不再测试它的重入性了,感兴趣的同学可以自行测试。这种方式是Java在jdk1.5才引入进来的功能,它的功能比synchronized关键字更为强大,但也有一个缺点:使用起来比synchronized关键字更麻烦。使用Lock来实现value++,代码如下:
class Entity { public static int value = 0; } class IncreaseThread implements Runnable { private static Lock lock = new ReentrantLock(); public void run() { for(int i=0; i <100000; i++){ lock.lock(); try { Entity.value++; } finally { lock.unlock(); } } } } public class ReentrantLockTest { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new IncreaseThread()); exec.execute(new IncreaseThread()); exec.shutdown(); Thread.sleep(5000); System.out.println("Value = " + Entity.value); } }