Python 提供了 try-with-lock,不需要显式地获取和释放锁,非常方便。Java 没有这样的机制,不过我们可以自己实现这个机制。
本文以访问量统计的简化场景为例,介绍相关内容,即:
public class VisitCounter { @Getter private long visits = 0; public void visit() { visits++; } }
这里的 visit()
方法,是线程不安全的,若多线程并发访问该方法,visits结果是错的。因此多线程下需要上锁,即:
public void safeVisit() { try { lock.lock(); visits++; } finally { lock.unlock(); } }
为避免lock... unlock的麻烦,本文提供了以下几种封装思路,仅供参考。
方案1 使用AutoCloseable
java7 开始提供的 AutoCloseable
接口,实现了 try-with-resources
功能,可以利用它来实现锁的自动释放。
public class AutoCloseableLock implements AutoCloseable{ private final Lock loc