如何在应用程序中避免死锁问题?

程序|问题

任何基于锁的并发系统的一个不可避免的特点是在某些条件下系统可能阻塞。当一个连接占有一个锁而另一个连接试图改变锁的状态时,第二个连接要么等待第一个连接释放锁,要么因此而被阻塞。

为了获得最好的可扩展性,性能和并发能力,在设计应用程序和查询语句时,应该注意尽量缩短事务的长度, 并且减少占有锁的时间。大多数并发问题往往出现在应用程序和数据库的设计阶段,因此,设计阶段如果充分考虑这个因素至关重要。 否则,应用程序就会存在潜在的潜能缺陷, 而且一般要到应用程序扩展性测试时才被发现。

时间: 2024-09-19 23:58:10

如何在应用程序中避免死锁问题?的相关文章

在WebSphere Application Server V6.1应用程序中跟踪死锁

学习如何使用 IBM WebSphere Application Server V6.1 中的线程转储工具了解您的系统环境,检查是否发生死锁以及提取信息来帮助避免或解决自己应用程序的死锁情况. 引言 当两个或多个线程彼此形成循环依赖关系时,就出现了死锁.例如,如果线程 A 处于等待线程 B 的等待状态,而同时线程 B 处于等待线程 A 的等待状态,则出现了死锁.一旦形成此情况,线程 A 和线程 B 都不能有任何进展,因为这两个线程现在都无限期地挂起了.为什么会有人创建这种系统?当然,您并不会有意

六个方法解决应用程序中死锁现象的出现

在应用程序中就可以采用下面的一些方法来避免死锁: (1)合理安排表访问顺序. (2)在事务中尽量避免用户干预,尽量使一个事务处理的任务少些, 保持事务简短并在一个批处理中. (3)数据访问时域离散法, 数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段.主要通过以下方式实现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理.工作流在管理任务时,一方面限制同一类任务的线程数(往往限制为1个),防止资源过多占用; 另一方面合理安排不同任

Java 程序中的多线程

程序|多线程 在Java程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应该能够编写简单的多线程程序. 为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 - 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含

实例讲解如何在DB2 UDB中监控死锁的发生

前言:这篇文章通过具体的实例阐述了如何在DB2 UDB 中监控死锁的发生.在DB2 UDB中有两种类型的监控器:快照监控器和事件监控器.快照顾名思义就是数据库连续状态下的一个切面,通过快照监控器,你可以很方便地查看当前连接的应用程序,当前等待的锁,当前的死锁,以及正在执行的SQL语句,同时你可以查看缓冲区,表和表空间的用法.假如保存历史数据,并且能够做出比较,对于分析数据库的并发性能有很大的帮助. 但是我们并不能猜测什么时候发生死锁,所以假如有一个后台程序能够一直监控数据库的活动,记录下所有的死

自动检测并行Java程序中的错误

当 CPU 进入多核时代之后,并行编程将更加流行,但是编写并行程序更容易 出错.在开发过程中,工程师能注意到同一个程序在单线程运行时是正确的,但 是在多线程时,它会有可能出错.和并行相关的错误的产生原因通常都非常隐晦 ,而且在一次测试中,它们的出现与否具有很强的随机性.由于程序中多个线程 之间可能以任意的方式交错执行,即使一个并行程序正确的运行了成百上千次, 下一次运行仍然可能出现新的错误. Multi-Thread Run-time Analysis Tool 是由 IBM 为多线程 Java

WCF回调中的死锁

一.服务器端死锁 对于如下服务: [ServiceContract(CallbackContract = typeof(INotify))] public class DownloadService { [OperationContract] public void Download() { //开始下载操作 //..... //通知下载完成 var callback = OperationContext.Current.GetCallbackChannel<INotify>(); callb

SQLServer中的死锁的介绍

原文:SQLServer中的死锁的介绍 简介      什么是死锁?      我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放.       什么又是阻塞?      阻塞是由于资源不足引起的排队等待现象.比如同时两个进程去更新一个表.      这里我们可以把阻塞作为死锁的必要条件.下面我们先理解一下死锁和阻塞再来看一下我最近遇到一个问题以及解决思路. SQLServer中的死锁      对应到

多线程中的死锁举例与分析(转)

  1. 一个特殊构造的程序考虑下面这个专门为说明多线程中的死锁现象而构造的程序: import java.util.LinkedList; public class Stack { public static void main(String[] args) { final Stack stack = new Stack(); new Thread("push") { @Override public void run() { for (int i = 0; i < 100;

深入解析Java并发程序中线程的同步与线程锁的使用_java

synchronized关键字 synchronized,我们谓之锁,主要用来给方法.代码块加锁.当某个方法或者代码块使用synchronized时,那么在同一时刻至多仅有有一个线程在执行该段代码.当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段.但是,其余线程是可以访问该对象中的非加锁代码块的. synchronized主要包括两种方法:synchronized 方法.synchronized 块. synchron