为了账号安全,请及时绑定邮箱和手机立即绑定

锁在 Java 中是如何工作的?

锁在 Java 中是如何工作的?

温温酱 2021-07-11 16:12:51
假设我有 2 个 a 实例CustomThread和一个名为printer. 在 的print方法内部printer,如果我在最后执行 alock.lock()和lock.unlock(),这是如何工作的?private class Printer{        private final Lock mutex = new ReentrantLock(true);        public void print(int thread){            try {                mutex.lock();                for(int i = 0; i < 10; ++i) {                    System.out.println(String.format("Printing: %d for Thread: %d", i, thread));                }            } catch(Exception e){            } finally {                mutex.unlock();            }        }    }我将从我的 2 个线程对象中调用此方法。我的问题是,方法lock本身如何?锁不是基于线程的吗?也许我在这里混淆了核心思想。当我在方法中加锁时,这意味着什么?
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

你可以把它想象成一个锁有一个叫做 的字段owner,它是一个Thread.

lock()被调用,并且ownernullowner被分配到调用线程。当unlock()被调用时,owner被重置为null

lock()被调用并且owner不是null(并且不是当前线程,因为锁是可重入的)时,调用线程会阻塞,直到另一个线程放弃所有权并且可以将其分配为新的所有者。

额外的复杂性是检查当前所有权以及将当前线程有条件地分配为新所有者,这两者都必须被其他线程原子地看到。这保留了锁的完整性。


查看完整回答
反对 回复 2021-07-29
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信