`
郑云飞
  • 浏览: 818516 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

买票程序的死锁的产生于解决

阅读更多
package tickets;

public class Tickets implements Runnable
{
	static int tickets = 100;
	Object o = new Object();
	boolean isSell = false;
	boolean ouse;//对象o锁定标志
	boolean tuse;//对象this锁定标志
	public void run()
	{
		// TODO Auto-generated method stub

		if(!isSell)
		{
			while(true)
			{
				if(!ouse&&!tuse)
				{
					try
					{
						Thread.sleep(1);
					} catch (InterruptedException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					ouse = true;
					tuse = true;				
					synchronized(o)
					{
						synchronized(this)
						{
							Thread.yield();
							if(tickets>0)
							{
								try
								{
									Thread.sleep(1);
								} catch (InterruptedException e)
								{
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
								System.out.println(Thread.currentThread().getName()+"卖出了第"+tickets+"张票");
								tickets--;
							}
							else
							{
								break;
							}						
						}
						ouse = false;
						tuse = false;
						Thread.yield();
					}
				}
			}
		}
		else
		{
			while(true)
			{
				if(!ouse&&!tuse)
				{try
				{
					Thread.sleep(1);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					ouse = true;
					tuse = true;

					if(!sell())
					{
						break;
					}
					else
					{
						Thread.yield();
					}
				}
			}
		}
	}
	
	public synchronized boolean sell()
	{
		try
		{
			Thread.sleep(10);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		synchronized(o)
		{
			Thread.yield();
			if(tickets>0)
			{
				try
				{
					Thread.sleep(10);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"用sell()卖出了第"+tickets+"张票");
				tickets--;
				ouse = false;
				tuse = false;
				return true;
			}		
			else
			{
				ouse = false;
				tuse = false;
				return false;
			}
		}
		

	}
	
}

 

package tickets;

public class TicketsTest
{
	
	public static void main(String[] args)
	{
		Tickets t = new Tickets();
		new Thread(t,"一号窗口").start();
		try
		{
			Thread.sleep(1);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t.isSell = true;
		new Thread(t,"二号窗口").start();
//		new Thread(t,"三号窗口").start();
//		new Thread(t,"四号窗口").start();
	}
}

 

分享到:
评论

相关推荐

    SQL Server死锁产生的原因及解决办法

    SQL Server死锁是数据库...总的来说,解决SQL Server中的死锁问题需要综合考虑数据库设计、事务管理、应用程序逻辑等多个层面,通过合理的资源调度和事务处理策略,可以显著减少死锁的发生,提升系统的稳定性和性能。

    浅析SQL SERVER死锁产生的原因及解决.pdf

    在探讨SQL Server数据库中死锁产生的原因及其解决方法之前,首先要了解死锁的基本概念。死锁是指在多线程系统中,两个或多个线程之间形成了循环依赖关系,导致它们都在等待对方释放资源,从而都无法继续执行下去的一...

    db2死锁问题分析及解决方案

    通过对DB2死锁问题的深入分析与实践操作,我们可以有效地识别和解决这类问题。这不仅包括了对错误代码的理解、基本的解决步骤,还包括了更为高级的技术手段,如利用监控工具和日志分析来定位问题根源。通过上述方法...

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    此次课程设计的主要内容是模拟实现资源分配。同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

    该系统能够响应进程对资源的动态请求与释放,通过合理的资源分配策略来避免死锁。 - **具体实现**: - 进程可以动态地申请和释放资源。 - 系统按照进程的申请动态分配资源。 #### 3. 实现步骤 - **第一步**: 设计...

    Java多线程程序死锁检查 JCarder

    JCarder是Java中用于检测多线程程序死锁的一款工具,它可以帮助开发者识别和避免死锁问题,提升程序的稳定性和效率。 首先,我们需要理解死锁的基本概念。在Java中,死锁通常发生在多个线程之间,每个线程持有某些...

    oracle死锁原因解决办法

    ### Oracle死锁原因及解决办法 ...了解死锁产生的原因,并采取适当的措施,不仅可以提高数据库性能,还能增强应用程序的稳定性和用户体验。对于Oracle数据库管理员来说,熟悉这些技术和方法是非常必要的。

    MySQL 死锁产生原因和解决办法

    ### MySQL 死锁产生原因与解决方案详解 #### 一、MySQL锁类型介绍 MySQL支持多种锁机制来确保数据的一致性和事务的隔离性。锁的主要目的是控制并发操作时的资源访问,防止数据不一致的问题。根据锁的作用范围不同...

    mysql死锁解决

    本文将详细介绍MySQL中的死锁现象、其产生的原因以及如何有效地检测与解决死锁问题。 #### 一、死锁定义 死锁是指两个或两个以上的事务在执行过程中,由于每个事务都持有某些资源且又都在等待其他事务释放其持有的...

    DB2解决表死锁

    本文将深入探讨“DB2解决表死锁”这一主题,结合提供的资源“DB2解除表锁.doc”,我们将讨论死锁的基本概念、DB2中的死锁检测、死锁预防以及如何在遇到死锁时进行有效的解决。 首先,我们要理解什么是死锁。死锁是...

    oracle数据库解决死锁

    Oracle数据库解决死锁 Oracle数据库解决死锁是指在Oracle数据库中出现的死锁问题,通过使用PL/SQL语句手动解决死锁问题。死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle...

    数据库死锁-解决死锁问题的三种办法

    与预防死锁相比,检测死锁是一种更为灵活但风险较高的策略。它允许死锁的发生,并在死锁发生后采取措施来解决。具体做法包括: 1. **定期检测**:数据库系统周期性地检查是否存在死锁状态,一旦发现死锁,就需要...

    浅析SQL SERVER死锁产生的原因及解决 (1).pdf

    为了解决死锁问题,需要对死锁产生的原因有深入的理解,并且掌握相应的解决方法。 首先,我们需要了解死锁产生的几个必要条件。死锁的产生依赖于以下四个条件的共同存在: 1. 互斥条件:资源不能被多个进程共享,...

    MySQL死锁的产生原因以及解决方案

    本文将探讨MySQL死锁的产生原因以及解决方案。 **死锁的产生原因** 1. **资源竞争与顺序依赖**:当两个事务A和B分别持有对方需要的资源,A等待B释放资源,B也在等待A释放资源,就会形成死锁。例如,事务A锁定表A后...

    一个简单的和死锁有关的程序

    标题:一个简单的和死锁有关的程序 ...综上所述,这段代码巧妙地展示了死锁的产生过程,帮助理解多线程编程中的资源竞争和同步问题。在实际开发中,应谨慎处理共享资源的访问,以避免死锁和其他并发问题。

    操作系统实验报告--模拟死锁避免程序

    ### 操作系统实验报告知识点详解 #### 实验背景与目的 ...此外,实验还涉及到了如何设计合理的输入输出接口以及如何有效处理用户输入等问题,这对于提高学生的编程能力和问题解决能力具有重要意义。

    多线死锁解决方案

    总结来说,解决多线程死锁问题需要从预防、避免、检测和恢复四个方面进行考虑。通过合理的资源管理、避免循环等待、使用线程安全的锁机制以及设置有效的监控和恢复策略,可以有效地减少死锁的发生。

    数据库 死锁的解决

    这类死锁通常是由于程序设计不当导致的,因此需要通过调整程序逻辑来解决。具体措施包括: 1. **减少资源锁定:** 尽可能避免同时锁定两个资源,减少并发操作中的锁冲突。 2. **统一锁定顺序:** 如果确实需要同时...

    解决ORACLE死锁问题

    一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 ...通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。

    SQL SERVER 死锁的解决之道

    在SQL Server中,死锁可能导致应用程序响应变慢,甚至完全挂起。 2. **死锁的原因** - 资源竞争:多个事务对同一资源进行互斥访问。 - 事务顺序:事务请求资源的顺序与资源被释放的顺序不匹配,形成循环依赖。 -...

Global site tag (gtag.js) - Google Analytics