Tag: 死锁

提示,以防止java中的死锁

我正在学习java线程和死锁,我理解死锁的例子,但是我想知道是否有通用的规则来阻止它。 我的问题是,如果有规则或技巧,可以应用到Java中的源代码,以防止死锁? 如果是的话,你能解释一下如何实现它吗?

为什么嵌套锁不会导致死锁?

可能重复: C#中的重入锁 为什么这个代码不会导致死锁? private static readonly object a = new object(); … lock(a) { lock(a) { …. } }

C ++终止调用没有一个活动的exception

我得到一个C ++线程错误: terminate called without an active exception Aborted 这里是代码: #include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename TYPE> class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &operator<<(TYPE &other) { std::unique_lock<std::mutex> mtx_lock(mtx); while(buffer.size()>=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP data out of the buffer […]

数据库:什么是多版本并发控制(MVCC),谁支持它?

Jeff最近发布了关于数据库与阅读相关的死锁问题。 多版本并发控制(MVCC)声称解决这个问题。 这是什么,什么数据库支持它? 更新:这些支持(其他人?) 神谕 PostgreSQL的

并发通用数据结构,没有死锁或资源匮乏

我最近问了一些有关TVar的问题,我仍然对livelock感到担忧。 所以我想到了这个结构: 每个事务都有一个唯一的优先级(可能是按创build顺序分配的)。 事务尝试获取对其访问的数据的读/写locking。 自然地,同时读取是可以的,但是一个写入locking排除所有其他(读取和写入)。 说事务A的优先级比事务B的优先级高。如果A持有锁,B等待,但是如果B持有锁并且A需要它,则B从锁中引导,A获得它,并且事务B重新启动(如同TVar ) 。 然而B保持当前优先重试。 当一个锁被释放并且等待事务时,它将进入最高优先级的事务,其余的继续等待。 我相信这个系统可以防止死锁,但也可以防止饥饿(与TVar不同)。 我想知道是否有人实施了这样一个系统,因为它似乎相当明显,我不想重新发明轮子。 当然,这样的方法很容易扩展到允许用户指定优先级。 优先级可以是pair (user_supplied_prio, auto_increment) , user_supplied_prio优先,但优先级相同的任务按FIFO顺序parsing。 评论/解决scheme: 实际上,当我想到这一点时,Haskell中已经存在,只需要使用一个IORef包装所有的数据,并且只使用atomicModifyIORef 。 atomicModifyIORef将确保交易按顺序应用。 但是,有人可能会认为这意味着数据结构是顺序的(即有效地限于一个线程),但实际上由于懒惰而是并行的。 为了解释这一点,考虑一个昂贵的函数f 。 我们打算把这个应用到一个Data.Map的关键字“foo”的数据。 用(foo -> future(fx))replace(foo -> x) (foo -> future(fx)) 。 这个线程将继续确定(fx)实际是什么,但同时我们可以将g应用到“bar”中。 由于将g应用于“bar”并不需要“foo”的结果,因此我们可以同时处理这个问题。 没有死锁,没有饥饿,最终所有交易将被处理(大致按照他们收到的顺序)。

在Java中编程死锁检测

如何以编程方式检测Java程序中是否发生了死锁?

如何在JavaScript中实现一个锁

如何在JavaScript中实现等同于C#的lock ? 所以,解释一下我在想一个简单的用例是: 用户点击buttonB B提出了一个onclick事件。 如果B处于event-state则事件在传播之前等待B处于ready-state 。 如果B处于ready-state ,则B被locking并被设置为event-state ,然后事件传播。 当事件的传播完成时, B被设置为ready-state 。 我可以看到如何接近这个可以完成,只需要添加和删除buttonready-state 。 但是,问题在于用户可以在一行中点击一个button的次数比可以设置的variables快两倍,所以在某些情况下,locking的尝试将失败。 有谁知道如何实现一个不会在JavaScript中失败的锁?

线程是否有可能死锁?

Java中的线程在技术上可能会自己死锁吗? 我在一次采访中被问到这个问题,回答说这是不可能的,但采访者告诉我说这是事实。 不幸的是我无法获得如何实现这个僵局的方法。 这让我想到了,我能想到的唯一情况就是在哪里有一个RMI服务器进程,其中包含一个调用自己的方法。 调用该方法的代码行放置在同步块中。 这甚至有可能或是面试官不正确? 我正在考虑的源代码是沿着这些线(其中testDeadlock在RMI服务器进程中运行) public boolean testDeadlock () throws RemoteException { synchronized (this) { //Call testDeadlock via RMI loopback } }

线程转储分析工具/方法

当Java应用程序挂起时,您甚至不知道导致此问题的用例并希望进行调查,我知道线程转储可能很有用。 但是我们怎样才能从线程转储中轻松地获取有用的数据来找出问题所在? 我一直在使用的服务器应用程序产生了非常长的线程转储,因为它是一个EJB体系结构,线程转储包含许多容器线程,我不知道应该看看(即线程不运行我的应用程序代码,但是JBoss的代码)。 昨天我尝试了线程转储分析工具。 该工具肯定比在文本编辑器中查看原始线程转储更好,因为您可以筛选出您不感兴趣的线程,查看线程列表,单击某个线程以查看其详细信息,比较线程转储以查找长时间运行的线程等。见下面的截图: 但是仍然有太多的数据需要分析 – 几乎有300个线程。 我不知道有什么标准可以用来过滤所有的JBoss线程,我不感兴趣。 我不确定是否应该只查看当前处于“可运行”状态的线程,或者“等待条件”和“Object.wait”中的线程也很重要。 你通常会遵循什么样的方法,以及一般使用的工具?

访问StackExchange.Redis时发生死锁

调用StackExchange.Redis时遇到了死锁情况。 我不知道到底发生了什么,这是非常令人沮丧的,我将不胜感激任何有助于解决或解决此问题的意见。 如果你也有这个问题,不想阅读所有这些; 我build议您尝试将PreserveAsyncOrder设置为false 。 ConnectionMultiplexer connection = …; connection.PreserveAsyncOrder = false; 这样做可能会解决这个Q&A的僵局,也可能会提高性能。 我们的设置 代码作为控制台应用程序或Azure工作者angular色运行。 它使用HttpMessageHandler公开REST API,因此入口点是asynchronous的。 代码的某些部分具有线程关联(属于并且必须由单个线程运行)。 代码的某些部分是仅asynchronous的。 我们正在进行asynchronous同步和asynchronous同步反模式。 (混合await和Wait() / Result )。 访问Redis时,我们只使用asynchronous方法。 我们使用.NET 4.5的StackExchange.Redis 1.0.450。 僵局 当应用程序/服务启动后,它会正常运行一段时间,然后突然(几乎)所有传入请求停止运行,它们从不产生响应。 所有这些请求都被locking,等待Redis的调用完成。 有趣的是,一旦发生死锁,任何对Redis的调用都将挂起,但前提是这些调用是通过在线程池中运行的传入API请求进行的。 我们还从低优先级后台线程调用Redis,并且这些调用即使在发生死锁后也能继续工作。 看起来,只有在线程池线程中调用Redis时才会发生死锁。 我不再认为这是由于这些调用是在线程池线程上进行的。 相反,任何asynchronousRedis调用没有延续,或者同步安全继续,即使在死锁情况发生后,它仍然可以继续工作。 (请参阅下面的内容) 有关 StackExchange.Redis死锁 混合引起的死锁await和Task.Result (同步asynchronous,就像我们一样)。 但是我们的代码运行时没有同步上下文,所以在这里不适用,对吧? 如何安全地混合同步和asynchronous代码? 是的,我们不应该这样做。 但是我们这样做了,我们将不得不继续这样做一段时间。 很多需要迁移到asynchronous世界的代码。 同样,我们没有同步上下文,所以这不应该造成死锁,对吧? 在任何await之前设置ConfigureAwait(false)对此没有影响。 async命令和Task.WhenAny在StackExchange.Redis中等待之后的超时exception 这是线程劫持问题。 目前情况如何? 这可能是这里的问题吗? StackExchange.Redisasynchronous调用挂起 从Marc的回答: 混合等待,等待不是一个好主意。 […]