Java多线程与并发(三)之死锁
2016-05-11 10:50
239 查看
死锁
过多的同步有可能出现死锁, 死锁的操作一般是在程序运行的时候才有可能出现。这就好比两个人相向开车堵了, 但是谁也不让谁,会一直堵下去。程序中也一样,如果发生了死锁,程序并不会报错,而是卡在那不动了。多线程中要进行资源的共享, 就需要同步, 但同步过多,就可能造成死锁
程序中出现死锁的一般原因就是在当前的同步方法中调用了其它对象的同步方法, 在我们编程时要注意避免这样写
死锁的发生的是不确定性的!
我简单的写了一个发生死锁的例子帮助理解(实际编程中切记不可):
描述: 这是一个服务员和顾客的故事, 服务员可能会说先付钱再吃饭, 但顾客也可能会说先吃饭再付钱, 如果两者同时说就会”僵持”起来也就是发生了死锁.
package com.lulu; public class DeadThreadDemo { public static void main(String[] args) { // TODO Auto-generated method stub new Thread(new DeadThread()).start(); } } // 服务员 class Customer { // 顾客对服务员说 public synchronized void say(Waiter w) { System.out.println("顾客说: 先吃饭再买单"); w.doService(); } public synchronized void doService() { System.out.println("顾客说: 好吧, 我同意了, 那就先付钱"); } } // 服务员 class Waiter { // 服务员对顾客说 public synchronized void say(Customer c) { System.out.println("服务员说: 先买单再吃饭"); c.doService(); } public synchronized void doService() { System.out.println("服务员说: 好吧, 我同意了, 那就先付吃饭"); } } // 死锁线程 class DeadThread implements Runnable { Customer c = new Customer(); Waiter w = new Waiter(); public DeadThread() { // TODO Auto-generated constructor stub new Thread(this) { @Override public void run() { // TODO Auto-generated method stub super.run(); c.say(w); } }.start(); } @Override public void run() { w.say(c); } }
代码运行结果是不确定的,如果发生了死锁两个人都在僵持着,程序就会卡住不动了, 也可能两个顺利都通过了.
图中运行结果就发生了死锁!
未完待续….
以上纯属个人见解, 如有不足之处希望有高人指出, 定感激不尽, 如有喜欢交流学习经验请给我留言谢谢.
原创文章, 转载请注明出处
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序