死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。
事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效。但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制它。在多通道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源还很有可能不止一个。因此,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。我们称这种状态为死锁。简单一点描述,死锁是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。
文件名:DeadThreadByExtend.java
注:
起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行。
synchronized 不能直接修饰变量。
synchronized 块并不会强制块内变量的单线程访问。仅仅意味着在执行块内语句时锁住synchronized (args)的参数,直到执行结束才释放。
package com.ycf.study.thread;class Sources{int a;public void setA(int x) {synchronized (this) {this.a = x;try {Thread.sleep(2000);}catch (InterruptedException e) {e.printStackTrace();}}}}public class DeadThreadByExtend {public static void main(String[] args) {Sources s1 = new Sources();Sources s2 = new Sources();class MyThread1 extends java.lang.Thread {@Override public void run() {System.out.println("线程1开始");synchronized (s1) {System.out.println("线程1申请修改s1");s1.setA(20);System.out.println("线程1修改完成");System.out.println("线程1申请修改s2");s2.setA(10);System.out.println("线程1修改s2完成");}System.out.println("线程1退出并释放锁++++++++++");}}class MyThread2 extends java.lang.Thread {@Override public void run() {System.out.println("线程2开始");synchronized (s2) {System.out.println("线程2申请修改s2");s2.setA(20);System.out.println("线程2修改s2完成");System.out.println("线程2申请修改s1");s1.setA(10);System.out.println("线程2修改s1完成");}System.out.println("线程2退出并释放锁++++++++++");}}MyThread1 mt1 = new MyThread1();MyThread2 mt2 = new MyThread2();mt1.start();mt2.start();}}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755