当前位置: 首页 > 面试题库 >

使用内在锁定输入

邹锦
2023-03-14
问题内容

我看不到以下代码如何产生看起来违反对象锁定义的输出。当然应该只允许一个线程打印“ acquired lock”消息,但两者都可以吗?

class InterruptThreadGroup {
    public static void main(String[] args) {
        Object lock = new Object();
        MyThread mt1 = new MyThread(lock);
        MyThread mt2 = new MyThread(lock);
        mt1.setName("A");
        mt1.start();
        mt2.setName("B");
        mt2.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        // Thread.currentThread().getThreadGroup().interrupt();
    }
}

class MyThread extends Thread {
    private Object lock;

    public MyThread(Object l) {
        this.lock = l;

    }

    public void run() {
        synchronized (lock) {
            System.out.println(getName() + " acquired lock");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                System.out.println(getName() + " interrupted.");
            }
            System.out.println(getName() + " terminating.");
        }
    }
}

问题答案:

这是因为对的调用lock.wait()释放了锁定,从而允许第二个线程进入同步块。从javadoc中提取

该线程释放此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待在该对象监视器上等待的线程唤醒。然后,线程等待,直到它可以重新获得监视器的所有权并恢复执行。

请注意,您的代码中存在一些问题,例如:

  • 你不应该在while循环之外等待
  • 没有通知,所以您的等待可能会永远持续
  • 与直接扩展Thread相比,让您的任务实现Runnable并将其作为参数传递给Thread的构造函数是一种更好的做法。


 类似资料:
  • 假设d是我们用来调用wait的对象。当线程调用d.wait时,它必须拥有d的内部锁,否则会引发错误。在同步方法中调用等待是获取内部锁的一种简单方法。 那么这是不是意味着两个线程不能同时调用wait()。这里的固有锁是什么意思【提到它是监视器】?但是monitor是如何实现互斥的呢? 一旦线程调用等待,它是否永远持有对象?如果是这样,其他线程使用该锁通知All()怎么样? 如果我们需要在 Notif

  • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

  • 问题内容: 我希望以下测试仅打印“已被锁定”一次。但是它因此会打印行。 据我了解,将在可能的情况下将其锁定(即,如果尚未锁定)。但是显然不是这样。 如何设置这样的锁线程安全? 问题答案: 名称为,表示您已经拥有锁了。 如果希望使用线程块,则可以使用例如具有1(或更多)许可的a。

  • 我的iOS应用程序在收到推送通知时出现了一个奇怪的情况。UI保持锁定,什么都不起作用。当我暂停调试器时,我会在我的线程中看到 。 对代码进行解译,我可以看到它与两件事有关: 方法(因为当我删除它时,问题就消失了)/li> 我收到一个推送通知,如下所示 我用Xcode做了一个新的简单的项目来证明我所说的。我使用前一个bundle标识符来接收相同的推送。按照AppDelegate中显示问题的代码操作:

  • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java

  • 我是excel VBA的新手,我到处都找不到我的答案。在我的工作表“后续日志”中,我希望范围内没有文本的单元格允许用户编辑(然后在更改后自动锁定),而那些有文本的单元格始终受到密码保护。我也希望范围使用不同的密码与工作表,并为用户输入密码,任何时候,他们希望编辑与范围内的文本单元格。 我使用的当前代码在输入文本后锁定单元格,但它改变了工作表密码,而不仅仅是单元格,而且只输入一次密码。这有道理吗?下