最近在看<实战Java高并发程序设计>,发现了之前没有接触过的几个名词. 死锁:之前在接触多线程的时候,接触过死锁的情况.死锁是线程中最糟糕的情况,如下面的图中的四辆车子一样,如果没有一辆车主动出来.那么这种状态永远会这样维持下去 饥饿(Starvation):饥饿是指某一线程或多个线程在某种情况下无法获取所需要的资源,导致程序无法执行.比如,当某个线程的优先级太低的时候,那么高优先级的线程会始终霸占着资源,而低优先级的线程由于无法得到相应的资源而无法工作.在自然界中,雏鸟就有这种情况,由于雏…
死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适.    ③ 资源分配不当. 产生死锁的条件有四个: ① 互斥条件:所谓互斥就是进程在某一时间内独占资源. ② 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. ③ 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺. ④ 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系.…
WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 Invoke,那么当这个 Lazy<T> 跨线程并发时,极有可能导致死锁.本文将具体说说这个例子. 本文内容 一段死锁的代码 此死锁的触发条件 此死锁的原因 此死锁的解决方法 更多死锁问题 一段死锁的代码 请先看一段非常简单的 WPF 代码: private Lazy<Walterlv>…
说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了.而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿.但是c++标准库里还没有这个概念,只有boost里面有这样现成的东西,而我又不想为了这么一个小东西引入个boost.所以,我借着这个机会研究了下,发现其实这些多线程/并发中的东西还是蛮有意思的. 阅读本文你可能需要如下的一些知识: 多线程编程的概念. c++的基本语法和有关多线程的语法. 第二条可能也没有那么重要,因为如果理解了多线程的这些东西,什…
死锁 死锁的定义 发生在并发中 当两个线程(或更多)线程(或线程)相互持有对方所需要的资源,又不主动释放,导致所有线程都无法继续执行,是程序陷入无尽的阻塞,这就是死锁. 如果多个线程之间的依赖关系是环形,存在环形的锁的依赖关系,那么也可能会发生死锁. 死锁的影响 死锁的影响在不同的系统中是不一样的,这取决于系统对死锁的处理能力. 数据库中:检测并放弃事务: JVM中:无法自动处理,但是提供了工具可以帮助我们取检测: 程序中的死锁 一旦发生,多是高并发场景,影响用户多: 整个系统崩溃,子系统崩溃,…
Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决. 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了.导致了死锁.这是最容易理解也是最简单的死锁的形式.但是实际环境中的死锁往往…
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥…
简介      什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是由于资源不足引起的排队等待现象.比如同时两个进程去更新一个表. 这里我们可以把阻塞作为死锁的必要条件.下面我们先理解一下死锁和阻塞再来看一下我最近遇到一个问题以及解决思路. SQLServer中的死锁      对应到SQL Server中,当在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的…
SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#ALFKI@#) waitfor del…
WCF回调中的死锁 一.服务器端死锁 对于如下服务: [ServiceContract(CallbackContract = typeof(INotify))] public class DownloadService { [OperationContract] public void Download() { //开始下载操作 //..... //通知下载完成 var callback = OperationContext.Current.GetCallbackChannel<INotify>…