我遇到了一个死锁情况,可以将其总结为如下所示的StaticDeadlock类。
这个简单的程序将冻结在 o.getClass()处 。这是我对发生的事情的推测,但是有人可以更好地解释吗?
1)程序进入StaticDeadlock静态块
2) 线程 启动
3) 主线程 置于等待 线程 完成,因此无法完成静态块
4)在 线程 内部,它访问 StaticDeadlock.o, 但StaticDeadlock的静态块尚未完成。因此程序冻结了吗?
public class StaticDeadlock
{
private static final Object o = new Object();
static {
MyThread thread = new MyThread();
thread.start();
try {
thread.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main (String[] args)
{
System.out.println("all is well.");
}
static class MyThread extends Thread
{
@Override
public void run ()
{
System.out.println("inside mythread");
o.getClass();
}
}
}
是的,仅此而已。新线程StaticDeadlock
在访问静态成员之前,等待的类初始化程序完成。有关更多详细信息,请参见Java语言规范的12.4.2节,尤其是以下步骤:
在Class对象上进行同步(第14.19节),该对象表示要初始化的类或接口。这涉及等待当前线程可以获取该对象的锁(第17.1节)。
如果正在通过其他线程对类或接口进行初始化,请等待此Class对象(临时释放锁)。当当前线程从等待中唤醒时,请重复此步骤。
如果当前线程正在对类或接口进行初始化,则这必须是对初始化的递归请求。释放对Class对象的锁定并正常完成。
如果类或接口已经初始化,则无需采取进一步的措施。释放对Class对象的锁定并正常完成。
它甚至不会超过第二个线程中的步骤1,因为第一个线程具有锁定并且不会释放它。
请注意,不是在调用getClass()
会导致问题-做 任何
需要使用value的操作o
都会使第二个线程等待类初始化程序完成,这当然不会发生,因为第一个线程正在等待第二个线程完成。
问题内容: 前几天,我在查看一些代码,然后发现: 来自C ++,我不知道为什么会这样。它不是错误,因为代码编译良好。这个“静态”代码块是什么? 问题答案: 这是一个静态初始化器。它是在加载类时执行的(确切地说是初始化,但通常不会注意到它们之间的区别)。 可以将其视为“类构造函数”。 请注意,还有一些实例初始化器,它们看起来一样,只是它们没有static关键字。当创建对象的新实例时,除了构造函数中的
我已经在我的Android项目中集成了一个第三方库。该库以. aar文件的形式提供。 它的实现是一个简单的单行程序,它在我的MainActivity中创建了一个customdialog。 但每当它试图创建对话框时,我的应用程序就会崩溃 我在一个新的空android项目中实现了这个库,它按计划工作。所以看起来和我的项目有冲突。 我在另一篇博文(这里)中读到,当project和library意外地将相
尝试可视化和理解同步。 对同步块使用静态锁定对象(代码a)和非静态锁定对象(代码B)之间有什么区别 它在实际应用中有什么不同 一方会有哪些陷阱而另一方不会 确定使用哪一个的标准是什么 代码A 代码B 笔记 上面的代码显示了构造函数,但是您可以讨论静态方法和非静态方法中的行为是如何不同的。另外,在同步块修改静态成员变量时使用静态锁是否有利? 我已经看过了这个问题的答案,但是还不清楚不同的使用场景是什
问题内容: 实际上,Linux上的 -static gcc标志现在不起作用。让我从GNU libc常见问题中引用: 2.22。 即使是静态链接程序也需要一些共享库,这对我来说是不可接受的。我能做什么? {AJ} NSS(有关详细信息,请键入“ info libc“名称服务开关”“)在没有共享库的情况下无法正常工作。NSS只需更改一个配置文件(/etc/nsswitch.conf)即可使用不同的服务
当我试图运行下面的代码时,每次我都得到错误“org.openqa.selenium.timeoutexception:Expected condition failed:waiting for visibility of element Locited by by.xpath”,我不确定xpate会是什么,请有人帮助我为登录应用程序创建自动化测试用例。 Java: HTML: