死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。
事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效。但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制它。在多通道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源还很有可能不止一个。因此,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。我们称这种状态为死锁。简单一点描述,死锁是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。
文件名:DeadThreadByExtend.java
注:
1、起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行。
2、synchronized 不能直接修饰变量。
3、synchronized 块并不会强制块内变量的单线程访问。仅仅意味着在执行块内语句时锁住synchronized (args)的参数,直到执行结束才释放。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
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(); } } |
总结
以上就是本文关于java线程死锁代码示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。
原文链接:http://www.cnblogs.com/rese-t/p/7857812.html