锁在 Java 中是如何工作的?

假设我有 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本身如何?锁不是基于线程的吗?也许我在这里混淆了核心思想。当我在方法中加锁时,这意味着什么?


温温酱
浏览 150回答 1
1回答

翻翻过去那场雪

你可以把它想象成一个锁有一个叫做 的字段owner,它是一个Thread.当lock()被调用,并且owner是null,owner被分配到调用线程。当unlock()被调用时,owner被重置为null。当lock()被调用并且owner不是null(并且不是当前线程,因为锁是可重入的)时,调用线程会阻塞,直到另一个线程放弃所有权并且可以将其分配为新的所有者。额外的复杂性是检查当前所有权以及将当前线程有条件地分配为新所有者,这两者都必须被其他线程原子地看到。这保留了锁的完整性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java