java 解决死锁(程序模拟)
来源:互联网 发布:淘宝差评回复 编辑:程序博客网 时间:2024/06/04 01:15
为了解决程序因占用资源,出现资源争抢,而出现的程序进入等待的状态(死锁)。
解决这种问题:
我们可以给资源加上“锁”,在每次调用前进行判断当前锁的状态,再进行执行。
下面是模拟程序:
package com.yxy.thread;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.Random;/** * @author windows * 安全锁例子 */public class Safelock { /** * @author windows * 朋友实体类 */ static class Friend { //朋友类,锁(重入锁) private final String name; private final Lock lock = new ReentrantLock(); //朋友构造方法 public Friend(String name) { this.name = name; } //获取名字 public String getName() { return this.name; } //在鞠躬前的判断 public boolean impendingBow(Friend bower) { //当前我的状态锁,与朋友的状态锁 Boolean myLock = false; Boolean yourLock = false; try { //记录当前类的锁,和鞠躬的朋友的锁的状态 myLock = lock.tryLock(); yourLock = bower.lock.tryLock(); } finally { //如果当前类的锁,与鞠躬朋友的类的状态,其中有一个为false时 if (! (myLock && yourLock)) { //判断是那个状态为true的,对这个锁进行解锁。 if (myLock) { lock.unlock(); } if (yourLock) { bower.lock.unlock(); } } } //返回结果 return myLock && yourLock; } /** * @param bower * 向朋友鞠躬的方法 */ public void bow(Friend bower) { //判断是否有锁 if (impendingBow(bower)) { //朋友鞠躬时,我没有鞠躬。打印出信息,并回敬。 try { System.out.format("%s: %s has" + " bowed to me!%n", this.name, bower.getName()); bower.bowBack(this); } finally { lock.unlock(); bower.lock.unlock(); } } else { //朋友鞠躬的同时我也鞠躬。打印出信息。 System.out.format("%s: %s started" + " to bow to me, but saw that" + " I was already bowing to" + " him.%n", this.name, bower.getName()); } } /** * @param bower * 回敬鞠躬的方法。 */ public void bowBack(Friend bower) { System.out.format("%s: %s has" + " bowed back to me!%n", this.name, bower.getName()); } } /** * @author windows * 循环鞠躬的线程 */ static class BowLoop implements Runnable { //相互鞠躬的两个人 private Friend bower; private Friend bowee; //构造方法 public BowLoop(Friend bower, Friend bowee) { this.bower = bower; this.bowee = bowee; } //线程的执行方法 public void run() { Random random = new Random(); for (;;) {//无限循环。 try { //进程中断 Thread.sleep(random.nextInt(5)); } catch (InterruptedException e) {} //bowee向bower鞠躬 bowee.bow(bower); } } } //测试 public static void main(String[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new BowLoop(alphonse, gaston)).start(); new Thread(new BowLoop(gaston, alphonse)).start(); }}
0 0
- java 解决死锁(程序模拟)
- java多线程 模拟死锁程序
- java中死锁程序和解决死锁的办法
- java模拟线程死锁
- java 线程死锁模拟
- Java 模拟多线程死锁
- java模拟死锁事故现场
- 模拟死锁 java
- java死锁及解决
- java 死锁及解决
- java 死锁及解决
- java 死锁及解决
- java 死锁及解决
- java 死锁及解决
- java 多线程 解决死锁
- java 死锁及解决
- 使用java线程模拟死锁
- java多线程之模拟死锁
- 有关于volatile的说明(含题目)
- 分享java的Serializable功能
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- tiny6410裸机实验第8章--------------中断(中断版UART)
- 职业体育与同性恋:假宽容与真偏见
- java 解决死锁(程序模拟)
- C EURO rsa 加解密和java rsa加解密的对接
- 关于架构
- 队列中取最大值操作问题
- hi3531应用程序开发
- ios项目如何实现版本更新?
- C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句
- AjaxFileUpload组件结合Struts2异步图片上传
- [2014-03-07]JAVA笔记_继承、方法重写