2 wudixiaowangjava wudixiaowangjava 于 2013.10.19 13:51 提问

java 模拟线程死锁实验

我想两个线程一直在售票知道票卖光,但是用while()控制循环后出现
售票2进入共享区
当前没有车票可以出售!
售票2进入共享区
当前没有车票可以出售!
售票2进入共享区
.....
具体代码如下
package com;
public class SaleThread extends Thread{
private String name;
ShareResource shareresource;
public SaleThread(){}
public SaleThread(String threadname){ //初始化线程名称的构造函数
this.name=threadname;
}
public SaleThread(String threadname,ShareResource shareresource1){//初始化共享区和线程名称
this.name=threadname;
shareresource=shareresource1;

}
public void run(){
//synchronized (shareresource){
while(shareresource.currentticket>=0){
if(this.shareresource.isAccessed()){
System.out.println(this.name+"进入共享区");
shareresource.changeAccess(); //禁止其他的线程进入共享区
//while(shareresource.currentticket>=0&&this.shareresource.isAccessed()){
if(shareresource.isEmpty()){
System.out.println("当前没有车票可以出售!");
shareresource.changeAccess(); //操作完毕退出共享区,其他线程可以进入
}else{
shareresource.currentticket--;
System.out.println(name+"正在售出一张车票,"+"还剩下"+shareresource.currentticket+"张票。");
shareresource.changeAccess(); //操作完毕退出共享区,其他线程可以进入
}
} //if 结束

else{
try{
shareresource.wait(100); //共享区不能进入该线程等待100ms
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
//}
}
}
package com;

public class ShareResource {
public int currentticket;
public boolean isaccessed=true;
public ShareResource(){}
public ShareResource(int ticketnum){ //初始化共享区里的车票数
this.currentticket=ticketnum;
}
public void setShareResource(int cticket){ //重置共享区里的车票数
this.currentticket=cticket;
}
public boolean isEmpty(){ //判断共享区是否为空
if(currentticket>0) return false;
return true;
}
public boolean isAccessed(){ //判断共享区能否进入
if(isaccessed) return true;
else return false;
}
public void changeAccess(){ //改变共享区状态
this.isaccessed=!isaccessed;
}
public static void main(String[] args){
ShareResource shareresource=new ShareResource(10);
SaleThread salethread1=new SaleThread("售票1",shareresource);
SaleThread salethread2=new SaleThread("售票2",shareresource);
salethread1.start();
salethread2.start();

}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java 线程死锁模拟
1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。   2,模拟死锁 背景介绍:我们创建一个朋友类,当朋友向我们鞠躬的时候,我们也要向朋友鞠躬,这样才算一个完整的动作。当两人 同时鞠躬的时候,都在等待对方鞠躬。这时就造成了死锁。   模拟程序: package com.yxy.thread; /** *
Java 多线程实现死锁场景
简述: 《Java 编程思想》  P718 ~ P722 模拟死锁的场景, 三个人 三根筷子,每个人需要拿到身边的两根筷子才能开始吃饭 出现死锁的场景是,三个人都拿到了右边的筷子,但是由于筷子都被抢占,均无法获得左边的筷子 Chopstick.java package com.anialy.test.multithread.philosophers; public cl
(十四)java多线程之死锁
本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 引言多线程如果设计的不合理的话,很可能就会出现死锁.当两个或者多个线程同事想要去获取共享资源的锁时,但每个线程都要等其他线
Java 多线程实现死锁场景 (r)
《Java 编程思想》  P718 ~ P722 模拟死锁的场景, 三个人 三根筷子,每个人需要拿到身边的两根筷子才能开始吃饭 出现死锁的场景是,三个人都拿到了右边的筷子,但是由于筷子都被抢占,均无法获得左边的筷子 Chopstick.java [java] view plain copy package
Java模拟排查线程死锁问题
一、模拟死锁 public class App { public static void main( String[] args ) { Object object1 = new Object(); Object object2 = new Object(); System.out.println("main thread st
java线程死锁例子及解决方法
Java线程死锁是由于有些资源彼此交叉取用,就有可能造成死结.如1线程中 取得A对象的锁定后又要取得B对象的锁定.但是同时2线程中取得B对象的锁定后又要取得A对象的锁定.这两个线程同时发生时就会造成,1线程拿到A对象锁定后等待B对象的锁定.2线程拿到B对象锁定后等待A对象锁定.这样就会进入没有停止的等待中.线程死锁的一个简单例子:package deadLockThread; publi
一个模拟死锁的多线程
package org.kevinlifeng; public class TestDeadLock implements Runnable {  public int flag = 1;  static Object o1 = new Object();  static Object o2 = new Object();  public void run() {   System.o
Java线程死锁及解决方案
要了解线程死锁,首先要明白什么是死锁 死锁 通俗点讲:死锁就是两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 用简单一点的例子来说吧 比如这个交通堵塞的例子,从图中可以看到四个方向行驶的汽车互相阻塞,如果没有任何一个方向的汽车退回去,那么将形成一个死锁 上述图中有产生死锁的四个原因:
Java线程死锁需要如何解决
Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键。不幸的是,使用上锁会带来其他问题。让我们来看一些常见问题以及相应的解决方法:   Java线程死锁   Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮
java线程死锁原因及避免
死锁原因:线程死锁的本质在于不同线程对资源锁的竞争,如果竞争中存在闭环,则会出现死锁。而为了避免死锁,最关键的是避免出现资源锁竞争的闭环。 避免死锁的秘诀:资源按顺序调用。 理解:1、资源指的是需要加锁的对象,不加锁就不存在竞争,也就谈不上资源的死锁。2、不同线程在调用资源时,均需按相同的顺序调用资源。 示例: 以下的示例只要testSynchronized方法传入的资源顺序相同,即不可能