ReentrantLock 是可重入的互斥锁

发布于 2024-10-18 22:28:17 字数 2445 浏览 7 评论 0

方法

  • lock :获取锁,如果锁被占用,则等待。
  • lockInterruptibly:获取锁,优先响应中断。
  • tryLock:尝试获得锁,如果成功,返回 true,如果失败返回 false,立即返回。
  • unLock:释放锁。

注意事项:一定要在 finally 中释放锁。

Demo

lock.lock();
try {
    // remove the ole cookie if there has had one
    cookieJar.remove(cookie);

    // add new cookie if it has a non-zero max-age
    if (cookie.getMaxAge() != 0) {
        URI effectiveURI = getEffectiveURI(uri);
        cookieJar.put(cookie, effectiveURI);
        // and add it to domain index
        if (cookie.getDomain() != null) {
            addIndex(domainIndex, cookie.getDomain(), cookie);
        }
        // add it to uri index, too
        addIndex(uriIndex, effectiveURI, cookie);
    }
} finally {
    lock.unlock();
}

可重入锁?

自己可以再次获取自己的内部锁。

synchronized 和 ReentrantLock 都是重入锁!

public class OptionT {
    public void method1() {
        synchronized (OptionT.class) {
            System.out.println("方法 1 获得 ReentrantTest 的锁运行了");
            method2();
        }
    }
    public void method2() {
        synchronized (OptionT.class) {
            System.out.println("方法 1 里面调用的方法 2 重入锁,也正常运行了");
        }
    }
    public static void main(String[] args) {
        new OptionT().method1();
    }
}

输出

方法 1 获得 ReentrantTest 的锁运行了
方法 1 里面调用的方法 2 重入锁,也正常运行了
public class OptionT {
    private Lock lock = new ReentrantLock();

    public void method1() {
        lock.lock();
        try {
            System.out.println("方法 1 获得 ReentrantLock 锁运行了");
            method2();
        } finally {
            lock.unlock();
        }
    }

    public void method2() {
        lock.lock();
        try {
            System.out.println("方法 1 里面调用的方法 2 重入 ReentrantLock 锁,也正常运行了");
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        new OptionT().method1();
    }

}

方法 1 获得 ReentrantLock 锁运行了
方法 1 里面调用的方法 2 重入 ReentrantLock 锁,也正常运行了

synchronized 和 ReentrantLock 比较

  • 都是可重入锁
  • synchronized 不会产生死锁,ReentrantLock 需要在 finally 中释放锁
  • ReentrantLock 具有公平锁还有非公平锁的实现。(公平锁耗时)
  • ReentrantLock 可以知道有没有成功获取锁
  • Lock 可以让等待锁的线程响应中断

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

无法回应

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

emdigitizer10

文章 0 评论 0

残龙傲雪

文章 0 评论 0

奢望

文章 0 评论 0

微信用户

文章 0 评论 0

又爬满兰若

文章 0 评论 0

独孤求败

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文