关于多线程中,线程获取的究竟是谁的锁

发布于 2022-09-12 13:43:23 字数 1335 浏览 15 评论 0

    public class Sample {
        Lock lock = new ReentrantLock();
        public void first() { // 当前线程连续持有 10 秒 sample 实例的锁
            try {
                lock.lock();
                for (int i = 0; i < 10; i++) {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        public void second() { // 当前线程在启动后的 5 秒内不断尝试获取 sample 实例的锁
            boolean locked = false;
            try {
                locked = lock.tryLock(5, TimeUnit.SECONDS); // 参数 1:最长等待时间、参数 2:时间单位
                System.out.println(locked);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (locked) {
                    lock.unlock();
                }
            }
        }
    }
public class Solution {
    public static void main(String[] args) throws InterruptedException {
        Sample sample = new Sample();
        new Thread(sample::first).start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(sample::second).start();
    }
}

请教示例代码中,两个线程在竞争锁,但线程竞争的是 sample 对象的锁,还是 lock 对象的锁呢?

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月流歌 2022-09-19 13:43:23

1、ReentrantLock 中存在名为 Sync 的内部类
2、Sync 为 AbstractQueuedSynchronizer(AQS)的子类
3、AQS 中存在名为 state 的成员变量
4、可重入锁加锁的过程就是通过 CAS 将 AQS 中的成员变量 state 由 0 变 1 的过程
5、程序前 10 秒 fisrt 线程已将 state 由 0 变 1,第 10 秒才将 1 恢复为 0
6、因此 second 线程在第 5 秒调用 tryLock 发现 state 为 1 则已经获取锁失败

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