java 进程死锁-java 模拟线程死锁实验

问题描述

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();

}

}

时间: 2024-09-27 18:29:40

java 进程死锁-java 模拟线程死锁实验的相关文章

java模拟线程死锁

  /* java线程死锁的模拟 两个线程同时请求对方的对方释放监视对象 造成死锁 请在 虚拟机 单核下运行 */ class  Test  {  public static void main(String []args)  throws Exception    {      ThreadOne td=new ThreadOne();      new Thread(td).start();      Thread.sleep(3);      new Thread(td).start();

运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1677155 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

从Java代码到Java堆

优化应用程序代码的内存使用并不是一个新主题,但是人们通常并没有很好地理解这个主题.本文将简要介绍 Java 进 程的内存使用,随后深入探讨您编写的 Java 代码的内存使用.最后,本文将展示提高代码内存效率的方法,特别强调了 HashMap 和 ArrayList 等 Java 集合的使用. 背景信息:Java 进程的内存使用 通过在命令行中执行 java 或者启动某种基于 Java 的中间件来运行 Java 应用程序时,Java 运行时会创建一个操作系统进程,就像您运行基于 C 的 程序时那样

java的线程死锁

由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推.这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难. 就语言本身来说,尚未直接提供防

JVM源码分析之一个Java进程究竟能创建多少线程

概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于Linux Kernel的源码分析,今天要说的是JVM里比较常见的一个问题 这个问题可能有几种表述 一个Java进程到底能创建多少线程? 到底有哪些因素决定了能创建多少线程? java.lang.OutOfMemoryError: unable to create new native thread的异常究竟是怎么回事 不过我这里先声明下可能不能完全百分百将各种因素都理出来,因为毕竟我不是做Lin

synchronized-Java的一个简单线程死锁问题

问题描述 Java的一个简单线程死锁问题 class BadPerson { public synchronized void say(GoodPerson good) { System.out.println(""把钱给我,放了你的人.""); good.give(); } public synchronized void give() { System.out.println(""得到了钱,同时被警察抓了.""); }}c

java并发编程学习: 守护线程(Daemon Thread)

在正式理解这个概念前,先把 守护线程 与 守护进程 这二个极其相似的说法区分开,守护进程通常是为了防止某些应用因各种意外原因退出,而在后台独立运行的系统服务或应用程序. 比如:我们开发了一个邮件发送程序,一直不停的监视队列池,发现有待发送的邮件,就将其发送出去.如果这个程序挂了(或被人误操作关了),邮件就不发出去了,为了防止这种情况,再开发一个类似windows 系统服务的应用,常驻后台,监制这个邮件发送程序是否在运行,如果没运行,则自动将其启动.   而我们今天说的java中的守护线程(Dae

Java基础-23总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程的意义? 提高

关于Java性能监控您不知道的5件事,第2部分:利用JDK内置分析器进行Java进程

关于Java性能监控您不知道的5件事,第2部分:利用JDK内置分析器进行Java进程监控 全功能内置分析器,如 JConsole 和 VisualVM 的成本有时比它们的性能费用还要高 - 尤其是在生产软件上运行的系统中.因此,在聚焦 Java 性能监控的第 2 篇文章中,我将介绍 5 个命令行分析工具,使开发人员仅关注运行的 Java 进程的一个方面. JDK 包括很多命令行实用程序,可以用于监控和管理 Java 应用程序性能.虽然大多数这类应用程序都被标注为 "实验型",在技术上不