- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面这段代码是为了演示一段OSGi代码中可能发生的死锁,直接取自免费下载的书籍:osgi in practice (Neil Bartlett) 。这本书总体上很容易理解,而且我发现它非常有用。但是,我不确定我是否遵循第 130 页中确定(并稍微讨论过)的并发问题。代码如下:
package org.osgi.book.reader.dbmailbox;
public class BadLockingMailboxRegistrationService implements MailboxRegistrationService {
private final Map<String,ServiceRegistration> map =
new HashMap<String,ServiceRegistration >();
private final BundleContext context ;
public BadLockingMailboxRegistrationService(BundleContext context) {
this . context = context ;
}
// DO NOT DO THIS!
public synchronized void registerMailbox ( String name, Mailbox mailbox){
ServiceRegistration priorReg = map.get(name);
if(priorReg != null) priorReg . unregister ();
Properties props = new Properties ();
props.put(Mailbox.NAME_PROPERTY , name);
ServiceRegistration reg =
context . registerService (Mailbox.class.getName(), mailbox , props );
map . put(name , reg );
}
}
用于显示死锁如何发生的讨论是:
To translate this unhappy situation to OSGi programming, imagine that a thread has taken a lock on an object F. Then it tries to call our register- Mailbox, which locks object K — but it must wait, perhaps because another thread is already executing registerMailbox. One of the callbacks resulting from the service registration then attempts to lock F . The result: two starving threads and no work done.
我理解讨论的第一部分,即线程可能会在对象 F 上获得锁定,该对象尝试调用 registerMailbox,从而在对象 K 上获得锁定(其中 K 是为此特定服务注册的服务对象,或者我认为是这样!)。现在可以肯定的是,另一个线程已经在执行registerMailbox。这意味着,它还需要锁定 K(因为 OSGi 分发单例服务对象)。现在讨论的回调在哪里可能会尝试锁定 F,从而导致死锁?
最佳答案
作者注意到,context.registerService
在执行期间通知同一线程上的服务注册监听器。如果这些监听器之一依次尝试获取锁 F
,则会导致死锁,因为 F
被同时持有 K
的线程持有。 .
线程2:调用registerMailbox
并获取K
线程1:在调用registerMailbox
之前获取F
,然后调用同步的registerMailbox
,从而尝试获取K
但由于它由线程 2 持有而阻塞
线程 2:最终执行 context.registerService
,进而调用尝试获取 F
的监听器/回调,并由于它由线程 1 持有而阻塞
由于两个线程以相反的顺序获取了两个锁,并且每个线程都获取了其中一个而不是第二个,因此会发生死锁。这实际上并不是一个特定于 OSGI 的问题,但我想是为了说明服务注册涉及监听器通知,并且应该在谨慎持有锁时调用。
关于java - 破译 OSGi 代码片段中的死锁情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32233212/
我正在尝试用 Python 破译标准的“a = 1, b = 2, c = 3...”密码,但我有点卡住了。我想要解密的消息是“he”——“8 5”,但由于我的 if 语句的顺序,输出是“eh”。有人
所以我正在编辑代码,并且有一段代码完全没有注释,所以我担心对其进行任何更改,这一切都是从这个 while 语句开始的。 有人能破译这个吗?从技术上描述这是在说什么/在做什么,我相信我能弄清楚我理解第一
好的,所以我在 Haskell 中有这段代码: data Bigit = O | I deriving (Show,Eq) add x y = reverse $ addC O (reverse x)
我继承了一个 BASIC 脚本,我正在尝试将其重写为 Python。我不知道 BASIC,甚至不知道这是哪个版本的 BASIC。是 Visual Basic 吗?请帮我翻译这段代码。 'County
我对 puppet 很陌生,只是想了解输出告诉我的内容。我有一个非常简单的 init.pp 文件来配置 shudders 文件: class sudo { package { sudo:
下面这段代码是为了演示一段OSGi代码中可能发生的死锁,直接取自免费下载的书籍:osgi in practice (Neil Bartlett) 。这本书总体上很容易理解,而且我发现它非常有用。但是,
我正在玩 vim-ruby 缩进,那里有一些非常复杂的正则表达式: " Regex used for words that, at the start of a line, add a level o
我继承了一个 BASIC 脚本,我正在尝试将其重写为 Python。我不知道 BASIC,甚至不知道这是哪个版本的 BASIC。是 Visual Basic 吗?请帮我翻译这段代码。 'County
我在逆向此代码以从 qwerty 解密回 abc 时遇到问题。 我不知道从哪里开始。我尝试用包含 ABC 的字符串替换索引...我还尝试将密文交换为 abc 并将索引更改为 qwerty,但无济于事。
我正在尝试设置一个 cron 作业,我收到了以下命令:wget -0 - -t 1 但我无法完全弄清楚如何使用此资源: http://www.computerhope.com/unix/wget.ht
这个问题在这里已经有了答案: tkinter creating buttons in for loop passing command arguments (4 个答案) 关闭 8 个月前。 我一直
我是 CMake 的新手(通常对 Makefiles、C 和 C++ 还是相当陌生)。我的任务是将我们当前的构建系统更改为使用 CMake 生成 Makefile 并编译我们的代码的系统。我在破译 C
我正在“玩”C++ 中的虚拟继承,我想知道一个类对象是如何布局的。我有这三个类: class A { private: int a; public: A() {this->a = 47
我正在尝试解读与 clr20r3 关联的 P1...P10 参数的含义,当我的应用程序遇到异常时,这些参数会写入事件日志。 我所拥有的最好的been able to find是: P1:托管进程(例如
我有一个带有 postgresql 后端的 Django 网络应用程序,用户可以在其中聚集并互相发送消息。这些消息可以被赞成或反对。如果有任何滥用行为,有很多反对票的人会得到“ghost banned
源代码 class W { public: virtual void f() { cout f(); // Invokes B::f why not w::f paw 指向 AW 的 vtable
我记得曾经看到一个网站,它破译了复杂的 C++ typedef,包括返回函数指针的函数指针,这些函数返回一个数组...... 它将把这样的定义变成可读的英文文本:»指向函数的指针,返回一个 int 指
我有这个 DIV 标签,其中有一个类定义。 我搜索了整个元素,但使用文本搜索功能在任何地方都找不到这个类。 目前,DIV 太宽了,我需要将其缩小一点。 每当我删除 class="clear
所以......我可以理解matlab函数句柄及其目的。但有时,当它变得过于神秘时,我需要帮助来进一步阐述它。 从默认 MATLAB documentation 中获取此示例,说: f = @(x)x
我正在尝试从 VB6 应用程序调用 TAPI32.dll 上的函数。我不知道如何在 VB6 中指定信息并调用它。所以,这个问题问的是帮助破译MSDN中的C++相关信息,并在VB6中调用它,但我在下面详
我是一名优秀的程序员,十分优秀!