黑马程序员_多线程(死锁)
来源:互联网 发布:exchange 587端口 编辑:程序博客网 时间:2024/06/04 18:50
------- android培训、java培训、期待与您交流! ----------
多线程_死锁
第一部分
1、死锁的描述
|--你持有一个锁,我也持有一个锁,我要到你的里面去运行,我就要拿到你的锁,而你要到我的里面的来运行,你也要向我要锁,我不放我的锁,我要进你的里面去,你不放你的锁,你要到我的里面来,谁都不放,相持不下,这样就导致了死锁的发生;这个现象就导致了程序就挂那边不动了,|--举例:你有一个筷子,我也有一根筷子,我说把你的筷子给我,我要吃饭,但是这是你也说让我把我的筷子给你,你也要吃饭,但是你不放你的筷子,我也不放我的这根筷子,咱们相持不下,谁都不要吃饭;2、死锁的出现
|--通常死锁的出现都是同步中嵌套同步|--要让一个同步函数进入到同步代码快里面,让一个同步代码快进入到一个同步函数里面;3、死锁代码体现
class Ticket implements Runnable{private int tick =800;Object obj = new Object();boolean flag = true;public void run(){if(flag)while(true){//同步代码块里面有同步函数,同步代码快用的锁是obj,同步函数用的锁是thissynchronized(obj){show();}}elsewhile(true)show();}//同步函数里面有同步代码块,this锁里面有obj锁public synchronized void show(){synchronized(obj){if(tick>0){try{Thread.sleep(10);}catch (Exception e){System.out.println(e.toString());}System.out.println(Thread.currentThread().getName()+"--code--"+tick--);}}}}class DeadLockDemo{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);//Thread t3 = new Thread(t);//Thread t4 = new Thread(t);t1.start();try{Thread.sleep(10);}catch (Exception e){System.out.println(e.toString());}t.flag =false;t2.start();//t3.start();//t4.start();}}4、运行结果
第二部分
1、死锁程序
这个程序是a拿着a锁想要进b里面去,b拿着b的锁想要进a来,两者都拿着锁不放,都相持不下;<span style="font-size:14px;">//面试时要写一个死锁</span><span style="font-size:18px;">class Test implements Runnable{private boolean flag;Test(boolean flag){this.flag = flag;}public void run(){if(flag){//用的是两个同步代码快,进行的验证,a锁里面有b锁,synchronized(MyLock.locka){System.out.println("if locka");synchronized(MyLock.lockb){System.out.println("if lockb");}}}else{//用的是两个同步代码块,b锁里面有a锁;synchronized(MyLock.lockb){System.out.println("else lockb");synchronized(MyLock.locka){System.out.println("else locka");}}}}}class MyLock{//静态直接有类名进行调用static Object locka = new Object();static Object lockb = new Object();}class DeadLockTest {public static void main(String[] args) {Thread t1 = new Thread(new Test(true));Thread t2 = new Thread(new Test(false));t1.start();t2.start();}}</span>2、运行结果
两者都拿着锁都不放,最后就锁住了;要避免死锁的发生;
第三部分
我的总结
|--死锁的发生就是两个程序都拿着自己的锁,想要进入到对方的锁中,但是两者都是拿着锁不放,相持不下,最后就锁住了;|--写程序时要避免死锁的发生;|--死锁在面试的时候,会要求让你写一个死锁出来;
0 0
- 黑马程序员_多线程死锁
- 黑马程序员_多线程(死锁)
- 黑马程序员_多线程之死锁
- 黑马程序员_多线程与死锁
- 黑马程序员-多线程死锁
- 黑马程序员_多线程的死锁和等待唤醒机制
- 黑马程序员_线程死锁
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- Unity3D中的Quaternion(四元数)
- 如何衡量代码质量?
- POJ 3983:快算24
- POJ 1466 Girls and Boys (匈牙利算法 最大独立集)
- ajax(1)helloword(GET)
- 黑马程序员_多线程(死锁)
- cocos2d-x 3.6创建工程
- 在JSP页面中使用Ajax主题时的引入
- Holding Your Objects 1-4
- 二维数组和数组指针
- leetcode--Combinations
- java集合的简单例子
- linux 安装jdk
- 51sap SD模块面试问题相关热门问题总结