浅谈线程同步的死锁

原创 2013年12月03日 11:03:48
说到线程就不得不说进程,线程和进程有着很大的区别,其实也没有什么可比性。
1.程序里至少包含一个进程,而进程里至少包含一个线程
2.进程在内存空间上是独立的,而线程要依靠进程才能“存活”
3.进程是操作系统资源分配的单位,线程是操作系统执行的单位

线程死锁:
当多个线程并发进行时,会根据优先级的不同而抢占进程资源,而进程的资源是由系统资源分配。例如有2个线程A、B,线程A和B都需要资源1、2才能执行完成。
出现一种情况,当线程A得到资源1开始运行,此时线程B得到资源2开始运行。接下来,线程A必须得到资源2才能继续运行,而线程B需要得到资源1才能继续运行。由于线程会将抢占的资源锁住,所以其他线程不能共用已经被锁的资源,此时程序就会进入到A和B都在等待对方锁住的资源,而无法执行下去的境地,即死锁。

下面用一个小程序分析一下:
浅谈线程同步的死锁

在前面已经声明了一个int类型的flag变量,作为标记。
声明两个静态的对象,作为线程运行的资源。
当类实现了Runnable接口就要重写Run方法,加入睡眠是为了更好的看出线程的同步。
主线程main里写线程的创建、启动和分别对两个线程的flag初始化,不再赘述了。

首先进入flag =1的线程1,执行锁住o1对象资源,进入睡眠,此时进入flag =0的线程2,执行锁住o2对象资源随即也进行睡眠。当线程1唤醒后想要继续执行,发现资源o2已经被线程2锁住了,则继续等待。当线程2唤醒后想要继续执行,发现资源o1已经被线程1锁住了,也将继续等待。

如此,线程1在等待线程2释放o2资源,线程2在等待线程1释放o1资源,就陷入了死锁状态,无限的等待下去,不两个线程都不会执行各自的System.out.println(),也无法终止程序。

执行结果:


解决线程死锁问题的方法很多,要根据具体的问题对待,最基本的方式是一个线程只锁定一种资源,而不是锁定这种资源里的个别小资源,也就是把锁的粒度加粗。

例如上面的例子,可以将synchronized关键字里的内容用this替换o1和o2,并且删掉第二个synchronized关键字,当线程1还没结束的时候锁住整个类的资源,使得线程2在线程1结束之前没办法使用。

浅谈线程同步的死锁

说到线程就不得不说进程,线程和进程有着很大的区别,其实也没有什么可比性。 1.程序里至少包含一个进程,而进程里至少包含一个线程 2.进程在内存空间上是独立的,而线程要依靠进程才能“存活” 3.进程...
  • wxmimperio
  • wxmimperio
  • 2013年12月05日 19:35
  • 236

Java_浅谈死锁的产生

class _15DeadLock { public static void main(String[] args){ MyTicket t=new MyTicket(); Thread t1=new...
  • yeziyfx
  • yeziyfx
  • 2014年08月06日 08:33
  • 220

浅谈死锁破除和优化

浅谈死锁优化
  • lonelyrains
  • lonelyrains
  • 2016年03月06日 21:42
  • 1603

浅谈 Linux 的死锁检测

死锁:就是多个进程(≥2)因为争夺资源而相互等待的一种现象,若无外力推动,将无法继续运行下去。 注意,只有在多进程或者多线程之间或者他们与中断之间相互通讯或者共享资源才有可能发生死锁,单线程或者进程...
  • andylauren
  • andylauren
  • 2017年04月10日 21:57
  • 124

浅谈Oracle死锁问题

摘要:在网络环境下,利用数据库可以实现资源的共享,但是如果数据库使用不当就会发生死锁现象,因此本文主要针对Oracle数据库死锁问题进行研究和探讨。 关键字:Oracle数据库、死锁、问题、研究。 由...
  • mrjiaxing
  • mrjiaxing
  • 2015年06月15日 21:09
  • 902

浅谈Linux死锁检测

浅谈Linux死锁检测
  • baidu_35534327
  • baidu_35534327
  • 2016年10月25日 21:37
  • 399

浅谈Linux中的 线程死锁

死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。 死锁有单进程死锁:进程A拥有资源1,而它又在请求资源1,而它所请求的资源1必须等待该资源使用完毕...
  • Lao_geng
  • Lao_geng
  • 2017年06月03日 13:22
  • 254

浅谈linux的死锁检测

死锁:就是多个进程(≥2)因为争夺资源而相互等待的一种现象,若无外力推动,将无法继续运行下去。 注意,只有在多进程或者多线程之间或者他们与中断之间相互通讯或者共享资源才有可能发生死锁,单线程或者进程...
  • u011279649
  • u011279649
  • 2013年09月10日 14:00
  • 1028

浅谈人工智能

历史      各个文明中都有杰出的工匠发明了自动机器来代替人类劳动,早在春秋时期鲁班就发明了世界上第一个机器人,可在空中飞翔‘三日不下’;三国时期蜀汉的诸葛亮发明了‘木牛流马’来运送战备物资,称得上...
  • oba_gaga
  • oba_gaga
  • 2016年10月09日 20:57
  • 2004

浅谈数据库设计

浅谈数据库设计 ——-目录(?)[+]第一章 需求分析设计简介设计步骤需求分析重要性实例小型电子商务网站第二章 逻辑设计E-R图设计范式概要第一范式1NF第二范式2NF第三范式3NF BC范式第三章 ...
  • CCSUXWZ
  • CCSUXWZ
  • 2017年06月21日 17:50
  • 299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈线程同步的死锁
举报原因:
原因补充:

(最多只允许输入30个字)