线程死锁导致文件损坏|JAVA多线程死锁问题

A. java多线程死锁问题

1. Java中导致死锁的原因Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。这是最容易理解也是最简单的死锁的形式。但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁L1并且申请获得锁L2,而线程T2持有锁L2并且申请获得锁L3,而线程T3持有锁L3并且申请获得锁L1,这样导致了一个锁依赖的环路:T1依赖T2的锁L2,T2依赖T3的锁L3,而T3依赖T1的锁L1。从而导致了死锁。从这两个例子,我们可以得出结论,产生死锁可能性的最根本原因是:线程在获得一个锁L1的情况下再去申请另外一个锁L2,也就是锁L1想要包含了锁L2,也就是说在获得了锁L1,并且没有释放锁L1的情况下,又去申请获得锁L2,这个是产生死锁的最根本原因。另一个原因是默认的锁申请操作是阻塞的。2. Java中如何避免死锁既然我们知道了产生死锁可能性的原因,那么就可以在编码时进行规避。Java是面向对象的编程语言,程序的最小单元是对象,对象封装了数据和操作,所以Java中的锁一般也是以对象为单位的,对象的内置锁保护对象中的数据的并发访问。所以如果我们能够避免在对象的同步方法中调用其它对象的同步方法,那么就可以避免死锁产生的可能性。如下所示的代码,就存在死锁的可能性:public class ClassB { private String address; // … public synchronized void method1(){ // do something } // … …}public class ClassA { private int id; private String name; private ClassB b; // … public synchronized void m1(){ // do something b.method1(); } // … …}上面的ClassA.m1()方法,在对象的同步方法中又调用了ClassB的同步方法method1(),所以存在死锁发生的可能性。我们可以修改如下,避免死锁:public class ClassA { private int id; private String name; private ClassB b; // … public void m2(){ synchronized(this){ // do something } b.method1(); } // … …}这样的话减小了锁定的范围,两个锁的申请就没有发生交叉,避免了死锁的可能性,这是最理性的情况,因为锁没有发生交叉。但是有时是不允许我们这样做的。此时,如果只有ClassA中只有一个m1这样的方法,需要同时获得两个对象上的锁,并且不会将实例属性 b 溢出(return b;),而是将实例属性 b 封闭在对象中,那么也不会发生死锁。因为无法形成死锁的闭环。但是如果ClassA中有多个方法需要同时获得两个对象上的锁,那么这些方法就必须以相同的顺序获得锁。比如银行转账的场景下,我们必须同时获得两个账户上的锁,才能进行操作,两个锁的申请必须发生交叉。这时我们也可以打破死锁的那个闭环,在涉及到要同时申请两个锁的方法中,总是以相同的顺序来申请锁,比如总是先申请 id 大的账户上的锁 ,然后再申请 id 小的账户上的锁,这样就无法形成导致死锁的那个闭环。public class Account { private int id; // 主键 private String name; private double balance; public void transfer(Account from, Account to, double money){ if(from.getId() > to.getId()){ synchronized(from){ synchronized(to){ // transfer } } }else{ synchronized(to){ synchronized(from){ // transfer } } } } public int getId() { return id; }}这样的话,即使发生了两个账户比如 id=1的和id=100的两个账户相互转账,因为不管是哪个线程先获得了id=100上的锁,另外一个线程都不会去获得id=1上的锁(因为他没有获得id=100上的锁),只能是哪个线程先获得id=100上的锁,哪个线程就先进行转账。这里除了使用id之外,如果没有类似id这样的属性可以比较,那么也可以使用对象的hashCode()的值来进行比较。上面我们说到,死锁的另一个原因是默认的锁申请操作是阻塞的,所以如果我们不使用默认阻塞的锁,也是可以避免死锁的。我们可以使用ReentrantLock.tryLock()方法,在一个循环中,如果tryLock()返回失败,那么就释放以及获得的锁,并睡眠一小段时间。这样就打破了死锁的闭环。比如:线程T1持有锁L1并且申请获得锁L2,而线程T2持有锁L2并且申请获得锁L3,而线程T3持有锁L3并且申请获得锁L1此时如果T3申请锁L1失败,那么T3释放锁L3,并进行睡眠,那么T2就可以获得L3了,然后T2执行完之后释放L2, L3,所以T1也可以获得L2了执行完然后释放锁L1, L2,然后T3睡眠醒来,也可以获得L1, L3了。打破了死锁的闭环。这些情况,都还是比较好处理的,因为它们都是相关的,我们很容易意识到这里有发生死锁的可能性,从而可以加以防备。很多情况的场景都不会很明显的让我们察觉到会存在发生死锁的可能性。所以我们还是要注意:一旦我们在一个同步方法中,或者说在一个锁的保护的范围中,调用了其它对象的方法时,就要十而分的小心:1)如果其它对象的这个方法会消耗比较长的时间,那么就会导致锁被我们持有了很长的时间;2)如果其它对象的这个方法是一个同步方法,那么就要注意避免发生死锁的可能性了;最好是能够避免在一个同步方法中调用其它对象的延时方法和同步方法。如果不能避免,就要采取上面说到的编码技巧,打破死锁的闭环,防止死锁的发生。同时我们还可以尽量使用“不可变对象”来避免锁的使用,在某些情况下还可以避免对象的共享,比如 new 一个新的对象代替共享的对象,因为锁一般是对象上的,对象不相同了,也就可以避免死锁,另外尽量避免使用静态同步方法,因为静态同步相当于全局锁。还有一些封闭技术可以使用:比如堆栈封闭,线程封闭,ThreadLocal,这些技术可以减少对象的共享,也就减少了死锁的可能性。

B. 数据库,因为高访问量,造成线程死锁的原因是,如何来解除呢

死锁主要是资源共享造成的冲突。比如a拥有资源1,需要资源2才能运行。b拥有资源2,需要资源1才能。这是就产生资源1、2都有,但a,b都无法运行的情况。解决死锁的方法有很多,你要了解更多的信息就去看看操作系统的数。里面讲的很详细。数据库中解决死锁的方法:1.限制同时访问数据库的用户数。2.超时线程自动释放。3.优化访问方式.

C. 线程死锁的概念 为什么产生死锁的原因及产生死锁的四个必要条件

产生死锁的原因主要是因为系统资源不足。进程运行推进的顺序不合适。资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

D. 多线程死锁怎么处理.net

有两种实现方法,分别是继承thread类与实现runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

E. 请问为什么系统有时候开机报出什么WINDOWS无法找到**文件但重启后就正常了

你的问题不详细~~~~是PC喇叭报警~~~或是启动WIN后弹出错误信息以下两中资料你可以参考一下:pc喇叭报警大全报警大全Windows系统错误代码大全 pc喇叭报警大全报警大全主板开机有报警声说明自检出了问题。报警声是由主板上的BIOS设定的。BIOS有两种,分别为AMI和AWARD。大多数主板都是采用AWARD的BIOS。1)AWARD的BIOS设定为: 长声不断响:内存条未插紧。 1短:系统正常启动。 2短:CMOS设置错误,需重新设置。 1长1短:内存或主板错误。 1长2短:显示器或显卡错误。 1长3短:键盘控制器错误。 1长9短:主板BIOS的FLASH RAM或EPROM错误。 2)AMI的BIOS设定为: 1短:内存刷新故障。 2短:内存ECC校验错误。 3短:系统基本内存检查失败。 4短:系统时钟出错。 5短:CPU出现错误。 6短:键盘控制器错误。 7短:系统实模式错误。 8短:显示内存错误。 9短:BIOS芯片检验错误。 1长3短:内存错误。 1长8短:显示器数据线或显卡未插好。Phoenix的BIOS自检响铃及其意义 1短 系统启动正常 1短1短1短 系统加电初始化失败 1短1短2短 主板错误 1短1短3短 CMOS或电池失效 1短1短4短 ROM BIOS校验错误 1短2短1短 系统时钟错误 1短2短2短 DMA初始化失败 1短2短3短 DMA页寄存器错误 1短3短1短 RAM刷新错误 1短3短2短 基本内存错误 1短4短1短 基本内存地址线错误 1短4短2短 基本内存校验错误 1短4短3短 EISA时序器错误 1短4短4短 EISA NMI口错误 2短1短1短 前64K基本内存错误 3短1短1短 DMA寄存器错误 3短1短2短 主DMA寄存器错误 3短1短3短 主中断处理寄存器错误 3短1短4短 从中断处理寄存器错误 3短2短4短 键盘控制器错误 3短1短3短 主中断处理寄存器错误 3短4短2短 显示错误 3短4短3短 时钟错误 4短2短2短 关机错误 4短2短3短 A20门错误 4短2短4短 保护模式中断错误 4短3短1短 内存错误 4短3短3短 时钟2错误 4短3短4短 时钟错误 4短4短1短 串行口错误 4短4短2短 并行口错误 4短4短3短 数字协处理器错误Windows系统错误代码大全0000 操作已成功完成。0001 错误的函数。 0002 系统找不到指定的文件。 0003 系统找不到指定的路径。 0004 系统无法打开文件。 0005 拒绝访问。 0006 句柄无效。 0007 存储区控制块已损坏。 0008 可用的存储区不足,无法执行该命令。 0009 存储区控制块地址无效。 0010 环境错误。 0011 试图使用不正确的格式加载程序。 0012 访问代码无效。 0013 数据无效。 0014 可用的存储区不足,无法完成该操作。 0015 系统找不到指定的驱动器。 0016 无法删除该目录。 0017 系统无法将文件移到其他磁盘驱动器上。 0018 没有其他文件。 0019 媒体写保护。 0020 系统找不到指定的设备。 0021 设备尚未准备好。 0022 设备无法识别该命令。 0023 数据错误(循环冗余检查)。 0024 程序发出命令,但是该命令的长度错误。 0025 驱动器在磁盘上无法定位指定的区域或磁道。 0026 无法访问指定的磁盘或软盘。 0027 驱动器找不到所请求的扇区。 0028 打印机缺纸。 0029 系统无法写入指定的设备。 0030 系统无法读取指定的设备。 0031 与系统连接的设备不能正常运转。 0032 其他进程正使用该文件,因此现在无法访问。 0033 另一进程已锁定该文件的某一部分,因此现在无法访问。 0034 驱动器中的软盘不正确。请将 %2 (卷标序列号: %3)插入驱动器 %1。 0036 打开共享的文件太多。 0038 已到达文件结尾。 0039 磁盘已满。 0050 不支持此网络请求。 0051 远程计算机无法使用。 0052 网络中存在重名。 0053 找不到网络路径。 0054 网络正忙。 0055 指定的网络资源或设备已不可用。 0056 已经达到网络命令的极限。 0057 网络适配器出现错误。 0058 指定的服务器无法执行所请求的操作。 0059 网络出现意外错误。 0060 远程适配器不兼容。 0061 打印机队列已满。 0062 服务器上没有存储等待打印的文件的空间。 0063 已经删除等候打印的文件。 0064 指定的网络名无法使用。 0065 拒绝访问网络。 0066 网络资源类型错误。 0067 找不到网络名。 0068 已超过本地计算机网络适配器卡的名称极限。 0069 已超过网络 BIOS 会话的极限。 0070 远程服务器已经暂停或者正在启动过程中。 0071 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。 0072 指定的打印机或磁盘设备已经暂停。 0080 该文件存在。0082 无法创建该目录或文件。 0083 INT 24 失败。 0084 处理该请求的存储区不可用。 0085 正在使用该本地设备名。 0086 指定的网络密码不正确。 0087 参数错误。 0088 网络出现写入错误。 0089 此时系统无法启动其他进程。 0100 无法创建其他系统标志。 0101 属于其他进程的专用标志。 0102 标志已经设置,无法关闭。 0103 无法再次设置该标志 0104 中断时无法请求专用标志。 0105 此标志先前的所有权已终止。 0106 请将软盘插入驱动器 %1。 0107 后续软盘尚未插入,程序停止。 0108 磁盘正在使用或已由其他进程锁定。 0109 管道已经结束。 0110 系统无法打开指定的设备或文件。 0111 文件名太长。 0112 磁盘空间不足。 0113 没有其他可用的内部文件标识符。 0114 目标内部文件标识符不正确。 0117 该应用程序所运行的 IOCTL 调用不正确。 0118 校验写入的开关参数值不正确。 0119 系统不支持所请求的命令。 0120 该系统上不支持此功能。 0121 标记已超时。 0123 文件名、目录名或卷标语法错误。 0124 系统调用层不正确。 0125 磁盘没有卷标。 0126 找不到指定的模块。 0127 找不到指定的过程。 0128 没有要等候的子进程。 0129 模式下运行。 0130 试图使用操作(而非原始磁盘I/O)的已打开磁盘分区的文件句柄。 0131 试图将文件指针移至文件开头之前。 0132 无法在指定的设备或文件中设置文件指针。 0133 对于包含已连接驱动器的驱动器,不能使用 JOIN 或 SUBST 命令。 0134 试图在已经连接的驱动器上使用 JOIN 或 SUBST 命令。 0135 试图在已经替换的驱动器上使用 JOIN 或 SUBST 命令。 0136 系统试图删除尚未连接的驱动器的 JOIN。 0137 系统试图删除尚未替换的驱动器的替换项。 0138 系统试图将驱动器连接到已连接的驱动器下的目录。 0139 系统试图将驱动器替换成已替换的驱动器下的目录。 0140 系统试图将驱动器连接到已替换的驱动器的一个目录中。 0141 系统试图将驱动器替换成到已连接的驱动器下的目录。 0142 此时系统无法运行 JOIN 或 SUBST。 0143 系统无法将驱动器连接到或替换成同一驱动器下的目录。 0144 此目录不是该根目录的子目录。 0145 该目录未清空。 0146 指定的路径已经在替换中使用。 0147 资源不足,无法执行该命令。 0148 此时无法使用指定的路径。 0149 试图连接或替换某个驱动器目录,该驱动器上的某个目录是上一次替换的目标目录。 0150 CONFIG.SYS 文件未指定系统跟踪信息,或禁止跟踪。 0151 DosMuxSemWait 的指定信号事件的数目不正确。 0152 DosMuxSemWait 没有运行;已经设置太多的标志。 0153 DosMuxSemWait 列表不正确。 0154 输入的卷标超过目标文件系统的标号字符长度极限。 0155 无法创建其他线程。 0156 接收进程拒绝该信号。 0157 已经放弃该区域,因此无法锁定。 0158 该区域已经解除锁定。 0159 线程标识符的地址错误。 0160 传到 DosExecPgm 的参数字符串错误。 0161 指定的路径无效。 0162 信号已挂起。 0164 系统无法创建其他线程。 0167 无法锁定文件的范围。 0170 所要求的资源正在使用中。 0173 锁定请求对于提供的取消区域不重要。 0174 文件系统不支持到锁定类型的自动更改。 0180 系统检测到错误的区域号码。 0182 操作系统无法运行 %1。 0183 不能创建已经存在的文件。 0186 传送的标志不正确。 0187 找不到指定的系统信号名称。 0188 操作系统无法运行 %1。 0189 操作系统无法运行 %1。 0190 操作系统无法运行 %1。 0191 无法在 Win32 模式下运行 %1。 0192 操作系统无法运行 %1。 0193 %1 不是有效的 Win32 应用程序。 0194 操作系统无法运行 %1。 0195 操作系统无法运行 %1。 0196 操作系统无法运行此应用程序。 0197 当前无法配置操作系统运行此应用程序。 0198 操作系统无法运行 %1。 0199 操作系统无法运行此应用程序。 0200 代码段应小于 64K。0201 操作系统无法运行 %1。 0202 操作系统无法运行 %1。 0203 系统找不到输入的环境选项。 0205 在命令子树中的进程没有信号句柄。 0206 文件名或扩展名太长。 0207 环 2 堆栈正在使用中。 0208 输入的全局文件名字符 * 或 ? 不正确,或指定的全局文件名字符太多。 0209 所发送的信号不正确。 0210 无法设置信号处理程序。 0212 区域已锁定,无法重新分配。 0214 附加到此程序或动态链接模块的动态链接模块太多。 0215 无法嵌套调用 LoadMole。 0216 图像文件 %1 有效,但不适用于本机类型。 0230 管道状态无效。 0231 所有的管道实例都处于忙状态。 0232 管道正在关闭。 0233 在管道的另一端没有进程。 0234 有更多可用的数据。 0240 已取消会话。 0254 指定的扩展属性名无效。 0255 扩展属性不一致。 0258 等待操作过时。 0259 没有其他可用数据。 0266 无法使用复制功能。 0267 目录名无效。 0275 扩展属性不匹配缓冲区。 0276 所装载的文件系统上的扩展属性文件已被损坏。 0277 扩展属性表格文件已满。 0278 指定的扩展属性句柄无效。 0282 安装的文件系统不支持扩展属性。 0288 试图释放不属于调用者的多路同步信号。 0298 信号投递的次数太多。 0299 仅完成部分 ReadProcessMemory 或 WriteProcessMemory 请求。 0300 操作锁定请求被拒绝。 0301 系统接收了一个无效的操作锁定确认。 0317 在 %2 的消息文件中,系统无法找到消息号为 0x%1 的消息文本。 0487 试图访问无效地址。 0534 运算结果超过 32 位。 0535 该管道的另一方有一进程。 0536 等候进程打开管道的另一端。 0994 拒绝对扩展属性的访问。 0995 由于线程退出或应用程序的要求,I/O 操作异常终止。 0996 重叠的 I/O 事件不处于已标记状态。 0997 正在处理重叠的 I/O 操作。 0998 对内存位置的无效访问。 0999 执行页内操作出错。 1001 递归太深;堆栈溢出。1002 窗口无法用来发送消息。 1003 无法完成此项功能。 1004 标志无效。 1005 卷不包含已识别的文件系统。请确认所有需要的文件系统驱动程序都已经加载,而且卷没有任何损坏。 1006 某文件的卷已在外部改变,因而打开的文件不再有效。 1007 要求的操作无法以全屏幕模式执行。 1008 试图引用并不存在的符号。 1009 配置注册表数据库已损坏。 1010 配置注册表主键无效。 1011 无法打开配置注册表主键。 1012 无法读取配置注册表主键。 1013 无法写入配置注册表主键。 1014 必须使用日志文件或其他副本来恢复注册表数据库中的某个文件。恢复成功。 1015 注册表已损坏。可能是一个包含注册表数据文件的结构已损坏,也可能内存中该文件的系统映像已损坏,或者因为备份副本(或日志)不存在(或损坏)导致无法恢复该文件。 1016 由注册表引起的 I/O 操作发生了不可恢复的错误。注册表将不能读取、写出或刷新包含注册表系统映像的其中一个文件。 1017 系统试图将文件加载或还原到注册表中,但是,指定的文件不是注册表文件格式。 1018 试图在注册表键(已经标记为删除)中完成的操作非法。 1019 系统无法在注册表日志文件中分配所需的空间。 1020 无法在已经有子键或键值的注册表项中创建符号链接。 1021 在易失的父键下不能创建固定的子键。 1022 通知的更改请求已经完成,并且返回信息还没有被送到调用者的缓冲区中。调用者需要列举所有文件以找到改动的内容。 1051 已将停止控制发送给与其他运行服务相关的服务。 1052 所要求的控制对此服务无效。 1053 服务没有及时地响应启动或控制请求。 1054 无法为该服务创建线程。 1055 服务数据库已锁定。 1056 该服务的实例已在运行。 1057 帐户名无效或者不存在,或者指定帐户名的密码无效。 1058 服务无法启动,可能因为被禁用,也可能因为没有关联的可用设备 。 1059 已经指定了循环服务的从属关系。 1060 指定的服务不是所安装的服务。 1061 该服务此时无法接收控制消息。 1062 服务尚未启动。 1063 服务进程无法连接到服务控制程序。 1064 处理控制请求时,服务出现意外情况。 1065 指定的数据库不存在。 1066 服务返回服务特定的错误码。 1067 进程意外地终止。 1068 无法启动从属服务或组。 1069 由于登录失败,没有启动服务。 1070 启动后,服务保持在启动挂起状态。 1071 指定的服务数据库锁定无效。 1072 指定的服务已经标记为删除。 1073 指定的服务已经存在。 1074 系统当前正以上一次运行成功的配置运行。 1075 从属服务不存在,或已经标记为删除。 1076 已接受使用当前引导作为最后的有效控制设置。 1077 自从上一次启动以后,没有再次启动过该服务。 1078 该名称已经用作服务名或服务显示名。 1079 此服务的帐户不同于运行于同一进程上的其它服务的帐户。 1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。 1081 这个服务所运行的进程和服务控制管理器相同。所以,如果服务进程意外中止的话,服务控制管理器无法进行任何操作。 1082 这个服务没有设置恢复程序。 1083 配置成在该可执行程序中运行的这个服务不能执行该服务。 1100 已经到达磁带的物理尽头。 1101 磁带访问到文件标记。 1102 到达磁带或分区首部。 1103 磁带访问到文件组的末尾。 1104 磁带上没有其他数据。 1105 磁带无法分区。 1106 访问多重卷分区的新磁带时,当前的区块大小不正确。 1107 加载磁带时,找不到磁带分区信息。 1108 无法锁定媒体退出功能。 1109 无法卸载媒体。 1110 驱动器中的媒体已经更改。 1111 已经复位 I/O 总线。 1112 驱动器中没有媒体。 1113 在目标多字节代码页中不存在对单码字符的映射。 1114 动态链接库 (DLL) 初始化例程失败。 1115 正在关闭系统。 1116 无法终止系统关机,因为没有进行中的关机操作。 1117 由于 I/O 设备出现错误,无法运行该请求。 1118 串行设备初始化失败。将卸载串行驱动程序。 1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。 1120 由于再次写入串行口,串行 I/O 操作已结束。(IOCTL_SERIAL_XOFF_COUNTER 为零。) 1121 由于超时,串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。) 1122 在软盘上找不到标识符地址标记。 1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。 1124 软盘控制器报告软盘驱动程序不能识别的错误。 1125 软盘控制器返回的结果和注册的不一致。 1126 访问硬盘时,再校准操作失败,再试一次后也无法操作。 1127 访问硬盘时,磁盘操作失败,再试一次后仍没有作用。 1128 访问硬盘时,需要重启动磁盘控制器,但仍未成功。 1129 磁带已卷到尽头。 1130 可用的服务器存储区不足,无法执行该命令。 1131 检测到潜在的死锁情况。 1132 指定的基址或文件偏移量没有正确对齐。 1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。 1141 系统 BIOS 无法更改系统电源状态。 1142 试图在一文件上创建超过系统允许数额的链接。 1150 指定的程序需要新的 Windows 版本。 1151 指定的程序不是 Windows 或 MS-DOS 程序。 1152 无法启动指定程序的多个实例。 1153 指定的程序是为 Windows 的早期版本编写的。 1154 运行此应用程序所需的某个库文件已损。 1155 没有应用程序与该操作中所指定的文件关联。 1156 将命令发送到应用程序时出现错误。 1157 找不到运行此应用程序所需的某个库文件。 1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。 1159 消息只能与同步操作一起使用。 1160 指出的源元素没有媒体。 1161 指出的目标元素已包含媒体。 1162 指出的元素不存在。 1163 指出的元素是未显示的存储资源的一部分。 1164 指出的设备需要重新初始化,因为硬件有错误。 1165 设备显示在尝试进一步操作之前需要清除。 1166 设备显示它的门仍是打开状态。 1167 设备没有连接。 1168 找不到元素。 1169 索引中没有同指定项相匹配的项。 1170 在对象上不存在指定的属性集。 1171 传递到 GetMouseMovePoints 的点不在缓冲区中。 1172 跟踪(工作站)服务没运行。 1173 找不到卷 ID。 1175 无法删除要被替换的文件。 1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。 1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。 1178 卷更改记录被删除。 1179 卷更改记录服务不处于活动中。 1180 找到一份文件,但是可能不是正确的文件。 1181 日志项已从日志中删除。 1200 指定的设备名无效。 1201 设备当前虽然未连接,但它是记忆连接。 1202 试图记起已经记住的设备。 1203 网络供应商不接受给定的网络路径。 1204 指定的网络供应商名无效。 1205 无法打开网络连接配置文件。 1206 网络连接配置文件已损坏。 1207 无法列举非包容类。 1208 出现扩展错误。 1209 指定组名的格式无效。 1210 指定计算机名的格式无效。 1211 指定事件名的格式无效。 1212 指定域名的格式无效。 1213 指定服务名的格式无效。 1214 指定网络名的格式无效。 1215 指定共享名的格式无效。 1216 指定密码的格式无效。 1217 指定的邮件名无效。 1218 指定邮件目的地的格式无效。 1219 所提供的凭据与现有凭据设置冲突。 1220 试图与网络服务器建立会话,但目前与该服务器建立的会话太多。 1221 网络上的其他计算机已经使用该工作组或域名。 1222 网络不存在或者没有启动。 1223 用户已经取消该操作。 1224 所要求的操作无法在已经打开用户映射区域的文件中运行。 1225 远程系统拒绝网络连接。 1226 已经关闭网络连接。 1227 网络传输的终点已经有一个地址与其关联。 1228 网络终点尚未与地址关联。 1229 试图在不存在的网络连接中操作。 1230 试图在活动的网络连接上进行无效操作。 1231 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 1232 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 1233 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 1234 远程系统的目标网络端点没有运行任何服务。 1235 该请求已经终止。 1236 本地系统已经终止网络连接。 1237 无法完成操作。请再试一次。 1238 无法创建到该服务器的连接,因为已经到达了该帐户同时连接的最大数目。 1239 试图在该帐户未授权的时间内登录。 1240 尚未授权此帐户从该站登录网络。 1241 网络地址无法用于要求的操作。 1242 服务已经注册。 1243 指定的服务不存在。 1244 由于尚未验证用户身份,无法执行要求的操作。 1245 由于用户尚未登录网络,无法运行要求的操作。指定的服务不存在。 1246 继续工作。 1247 完成初始化操作后,试图再次运行初始化操作。 1248 没有其他本地设备。 1249 指定的站点不存在。 1250 具有指定名称的域控制器已经存在。 1251 只有连接到服务器上时,才支持该操作。 1252 即使没有改动,组策略框架也应该调用扩展。 1253 指定的用户没有一个有效的配置文件。 1254 Microsoft Small Business Server 不支持此操作。 1300 不是对所有的调用方分配引用特权。 1301 帐户名与安全标识符之间的映射未完成。 1302 没有为该帐户明确地设置系统配额限制。 1303 没有可用的密钥。返回已知的密钥。 1304 密码太复杂,无法转换成 LAN Manager 密码。返回的 LAN Manager 密码是空字符串。 1305 修订级别未知。 1306 表示两个修订级别不兼容。 1307 无法将此安全标识符指定为该对象的拥有者。 1308 无法将此安全标识符指定为主要的对象组。 1309 当前并未模拟客户的线程试图操作模拟令牌。 1310 不可以禁用该组。 1311 目前没有可用的登录服务器处理登录请求。 1312 指定的登录会话不存在。该会话可能已终止。 1313 指定的权限不存在。 1314 客户不保留请求的权限。 1315 提供的名称不是正确的帐户名称格式。 1316 指定的用户已经存在。 1317 指定的用户不存在。 1318 指定的组已经存在。 1319 指定的组不存在。 1320 或者指定的用户帐户已经是某个特定组的成员,或者也可能指定的组非空而不能被删除。 1321 指定的用户帐户不是所指定组帐户的成员。 1322 上次保留的管理帐户无法关闭或删除。 1323 无法更新密码。所输入的密码不正确。 1324 无法更新密码。所提供的新密码包含不可用于密码的值。 1325 无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。 1326 登录失败: 用户名未知或密码错误。 1327 登录失败: 用户帐户限制。 1328 登录失败: 违反帐户登录时间限制。 1329 登录失败: 禁止用户登录到该计算机上。 1330 登录失败: 指定的帐户密码已过期。 1331 登录失败: 当前禁用帐户。 1332 未完成帐户名与安全性标识符之间的映射。 1333 一次请求的本地用户标识符(LUID)太多。 1334 没有其他可用的本地用户标识符(LUID)。 1335 对这个特定使用来说,安全标识符的子部分是无效的。 1336 访问控制清单(ACL)结构无效。 1337 安全标识符结构无效。 1338 安全描述符结构无效。 1340 无法创建继承的访问控制列表(ACL)或访问控制项目(ACE)。 1341 当前已禁用服务器。 1342 当前已启用服务器。 1343 所提供的值是无效的标识符授权值。 1344 没有更多的内存用于更新安全信息。 1345 指定的属性无效,或指定的属性与整个组的属性不兼容。 1346 或者没有提供所申请的模仿级别,或者提供的模仿级别无效。 1347 无法打开匿名级安全性符号。 1348 所请求的验证信息类别无效。 1349 该类符号不能以所尝试的方式使用。 1350 无法在没有相关安全性的对象上运行安全操作。 1351 未能从域控制器读取配置信息,或者是因为机器不可使用,或者是访问被拒绝。1352 安全帐户管理程序(SAM)或本地安全颁发机构(LSA)服务器状态不正确,所以无法运行安全操作。 1353 域处于执行安全操作的错误状态。 1354 该操作只能在域的主域控制器中执行。 1355 指定的域不存在或联系不上。 1356 指定的域已经存在。 1357 试图超过每个服务器域数目的极限。 1358 由于严重的媒体错误或磁盘的数据结构损坏,无法完成所请求的操作。 1359 发生内部错误。 1360 通用的访问类型包含在访问掩码中,该掩码已经映射为非通用类型。 1361 安全性描述符的格式错误(绝对或自相关)。 1362 请求的操作只准登录进程使用。该调用过程并未被记录为登录进程。 1363 无法用已经使用的标识符来启动新的登录会话。 1364 指定的确认数据包未知。 1365 登录会话的状态与请求的操作不一致。 1366 登录会话标识符正在使用中。 1367 登录请求包含无效的登录类型值。 1368 在使用命名管道读取数据之前,无法经由该管道模拟。 1369 注册表子树的事务状态与所请求的操作不兼容。 1370 突发的内部安全性数据库故障。 1371 无法在内部帐户下运行该操作。 1372 无法在该内部特定组中运行该操作。 1373 无法在该内部特定用户中运行该操作。 1374 因为该组当前是用户的主要组,所以不能从此组中删除用户。 1375 该符号已作为主要符号使用。 1376 指定的本地组不存在。 1377 指定的帐户名不是本地组的成员。 1378 指定的帐户名已经是本地组的成员。 1379 指定的本地组已经存在。 1380 登录失败: 用户在本计算机上没有被授与所需注册类型。 1381 超过了可以存储在单个系统中的最大机密限制。 1382 机密的长度超过了最大允许值。 1383 本地安全授权数据库包含内部不一致的错误。 1384 登录时,用户的安全性上下文累积太多的安全标识符。 1385 登录失败: 用户在本计算机上没有被授与所需注册类型。 1386 经交叉加密的密码必须更改用?

F. 什么是java线程死锁,如何解决死锁问题

比如有两个线程执行,线程t1, 线程t2t1 需要获取方法A的锁标志,同时方法A调用了方法B,t1获取了A的锁标志,并获取了B的锁标志,才能完成执行同时t2也在执行,t2获取方法B的锁标志,方法B调用了方法A,t2也需要获取两个方法A,B的锁标志才能执行完成当t1 获取了A方法的锁标志,同时t2获取了B方法的锁标志那么t1会等待t2释放方法B的锁标志,t2也在等待t1释放方法A的锁标志,这样就形成了死锁,都在等待….

G. JAVA中,线程死锁是什么意思

死锁属于操作系统的概念了……其实很好理解。最经典的例子就是,You first,You first问题。一个门专,两个“中国属人”,都很有礼貌,走碰头了,都想过这个门,两个人都谦让对方先过,结果是,谁也过不去……。还有就是哲学家问题!说是四个哲学家坐在桌子上等着吃饭,每个人一边一根筷子,四个人四根筷子。一个人拿到两根筷子的时候才能吃。否则等待…… ,有一种情况就是,四个人,每个人都拿了一根筷子,还没有人放手。结果四个人都饿死……所以死锁发生需要几个条件1.循环等待2.不可剥夺3.资源独占4.这个忘掉了……不好意思……想起来了。是保持申请……

H. 死锁怎么解决

处理死锁的思路如下:

预防死锁:破坏四个必要条件中的一个或多个来预防死锁。

避免死锁:在资源动态分配的过程中,用某种方式防止系统进入不安全的状态。

检测死锁:运行时产生死锁,及时发现思索,将程序解脱出来。

解除死锁:发生死锁后,撤销进程,回收资源,分配给正在阻塞状态的进程。

预防死锁的办法:

破坏请求和保持条件:

1、一次性的申请所有资源。之后不在申请资源,如果不满足资源条件则得不到资源分配。

2、只获得初期资源运行,之后将运行完的资源释放,请求新的资源。

破坏不可抢占条件:当一个进程获得某种不可抢占资源,提出新的资源申请,若不能满足,则释放所有资源,以后需要,再次重新申请。

破坏循环等待条件:对资源进行排号,按照序号递增的顺序请求资源。若进程获得序号高的资源想要获取序号低的资源,就需要先释放序号高的资源。

(8)线程死锁导致文件损坏扩展阅读

形成死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。

举例来说:有两个进程A和B,A持有资源a等待b资源,B持有资源b等待a资源,两个进程都在等待另一个资源的同时不释放资源,就形成死锁。

I. 如何解决多线程造成的数据库死锁

多线程是很容易造成死锁,一般情况下死锁都是因为并发操作引起的。我不懂JAVA,但死锁这个问题每种开发工具和数据库都会碰到.解决办法是:1、程序方面优化算法(如有序资源分配法、银行算法等),在一个程序里,能不用多线程更新同一张数据库表尽量不要用,如果要用,其避免死锁的算法就很复杂。2、数据库方面设置等待超时时间3、发生死锁后直接KILL掉数据库进程

J. linux内核线程死锁或死循环之后如何让系统宕机重启

在开发内核模块或驱动时,如果处理失误,导致内核线程中出现死锁或者死循环,你会发现,除了重启之外,你没有任何可以做的。这时你的输入不起任何作用,终端(不是指远程的ssh工具)只会在那重复的输出类似“BUG: soft lockup – CPU#0 stuck for 67s! [fclustertool:2043]”,更无奈的是你重启之后导致系统挂起的堆栈信息也看不到,你所能做的就是一遍遍的加调试信息,一遍遍的重启机器(这是我的经历,现在想想很傻)。这种情况你肯定不是第一个遇到的,所以内核肯定会提供处理这种情况的一些机制。但是如何来找到这些机制在哪个地方,或者说根据什么信息去google呢?最有用的就是这句话“BUG: soft lockup – CPU#0 stuck for 67s! [fclustertool:2043]”,因为这句话提供你的信息量很大。首先,这条信息可以输出,说明即使发生死锁或者死循环,还是有代码可以执行。第二,可以通过这个日志信息,找到对应的处理函数,这个函数所在的模块就是用来处理CPU被过度使用时用到的。所以通过这个事情,可以看到内核打印出的只言片语都有可能成为你解决问题的关键,一定要从重视这些信息,从中找出有用的东西。我经常看的内核版本是官方的2.6.32内核,这个版本中我找到的函数是softlockup_tick(),这个函数在时钟中断的处理函数run_local_timers()中调用。这个函数会首先检查watchdog线程是否被挂起,如果不是watchdog线程,会检查当前占有CPU的线程占有的时间是否超过系统配置的阈值,即softlockup_thresh。如果当前占有CPU的时间过长,则会在系统日志中输出我们上面看到的那条日志。接下来才是最关键的,就是输出模块信息、寄存器信息和堆栈信息,检查softlockup_panic的值是否为1。如果softlockup_panic为1,则调用panic()让内核挂起,输出OOPS信息。代码如下所示:/** This callback runs from the timer interrupt, and checks* whether the watchdog thread has hung or not:*/void softlockup_tick(void){int this_cpu = smp_processor_id();unsigned long touch_timestamp = per_cpu(touch_timestamp, this_cpu);unsigned long print_timestamp;struct pt_regs *regs = get_irq_regs();unsigned long now;/* Warn about unreasonable delays: */if (now <= (touch_timestamp + softlockup_thresh))return;per_cpu(print_timestamp, this_cpu) = touch_timestamp;spin_lock(&print_lock);printk(KERN_ERR BUG: soft lockup – CPU#%d stuck for %lus! [%s:%d]\n,this_cpu, now – touch_timestamp,current-comm, task_pid_nr(current));print_moles();print_irqtrace_events(current);if (regs)show_regs(regs);elsemp_stack();spin_unlock(&print_lock);if (softlockup_panic)panic(softlockup: hung tasks);}但是softlockup_panic的值默认竟然是0,所以在出现死锁或者死循环的时候,会一直只输出日志信息,而不会宕机,这个真是好坑啊!所以你得手动修改/proc/sys/kernel/softlockup_panic的值,让内核可以在死锁或者死循环的时候可以宕机。如果你的机器中安装了kmp,在重启之后,你会得到一份内核的core文件,这时从core文件中查找问题就方便很多了,而且再也不用手动重启机器了。如果你的内核是标准内核的话,可以通过修改/proc/sys/kernel/softlockup_thresh来修改超时的阈值,如果是CentOS内核的话,对应的文件是/proc/sys/kernel/watchdog_thresh。CentOS内核和标准内核还有一个地方不一样,就是处理CPU占用时间过长的函数,CentOS下是watchdog_timer_fn()函数。这里介绍下lockup的概念。lockup分为soft lockup和hard lockup。 soft lockup是指内核中有BUG导致在内核模式下一直循环的时间超过10s(根据实现和配置有所不同),而其他进程得不到运行的机会。hard softlockup是指内核已经挂起,可以通过watchdog这样的机制来获取详细信息。这两个概念比较类似。如果你想了解更多关于lockup的信息,可以参考这篇文档:注意上面说的这些,都是在内核线程中有效,对用户态的死循环没用。如果要监视用户态的死循环,或者内存不足等资源的情况,强烈推荐软件层面的watchdog。具体的操作可以参考下面的文章,都写的非常好,非常实用:


赞 (0)