`

线程—代码模拟—死锁

阅读更多
1、背景知识


关于进程和线程的区别,总有人喜欢这样问。
这就像问 java中 final 、 finally 、finalize 的区别一样滑稽。(只是因为这3个关键字的开头都含有f、i、n、a、l这几个字母么?)

进程和线程是2种不同的程序运行的机制。2者实现的方式不同。基本上没有可比性。
用进程设计实现的程序,跑不了所谓的线程。即使有线程的概念,也和使用线程实现的程序中线程的概念相差甚远。2者根本不是一个东西。

如果要谈区别,说:进程设计理念 和 线程设计理念 有何区别。我想还不多。不要钻进进程里谈进程和线程,也不要钻进线程里谈进程和线程。

java虚拟机是线程实现的。



2、死锁

在一个线程中,需要锁定2个及以上对象,但是需要去锁定的对象,被别的线程锁定,而别的线程依赖当前线程已锁定的对象。

TestDeadLock.java
public class TestDeadLock implements Runnable{
	public int flag =1;
	static Object o1 = new Object();
	static Object o2 = new Object();

	public void run(){
		System.out.println("flag=" +flag);
		if(flag == 1){
			synchronized(o1){
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
			synchronized(o2){
				System.out.println("1");
			} 			 			 			
			}
		}
		if(flag == 0){
			synchronized(o2){
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
			synchronized(o1){
				System.out.println("0");
			} 			 			 			
			}
		} 
	}
	public static void main(String[] args){
		TestDeadLock td1 = new TestDeadLock();
		TestDeadLock td2 = new TestDeadLock();
		td1.flag = 1;
		td2.flag = 0;
		Thread t1 = new Thread(td1);
		Thread t2 = new Thread(td2);
		t1.start();
		t2.start();
	}
}













-
分享到:
评论

相关推荐

    java模拟线程死锁

    Java 模拟线程死锁 线程死锁 在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他...

    Linux系统线程死锁实验报告.pdf

    `sleep()`函数使得线程暂停执行指定的秒数,它在代码中被用于模拟线程执行所需时间。这有助于保证线程间的资源竞争和死锁的产生。 9. 代码错误处理: 在实验代码中,包含了错误处理逻辑,例如使用`pthread_mutex_...

    死锁,进程和线程实验报告

    在实验中,我们模拟了银行家算法,这是一种避免死锁的经典策略,它通过预先分配和动态调整资源来确保系统的安全性。 接着,我们探讨了**进程**。进程是程序的一次执行过程,是操作系统资源分配的基本单位。每个进程...

    操作系统 实验报告(含代码) 死锁和饥饿2 哲学家就餐问题

    3. **实践操作**:通过编写程序来模拟哲学家就餐场景,验证不同的解决方案是否能有效避免死锁与饥饿问题。 #### 问题描述与解决方案 **问题描述**:在哲学家就餐问题中,假设一张圆桌周围有五个哲学家,每个哲学家...

    java线程死锁代码示例

    为了模拟死锁,我们使用 synchronized 块来锁住这两个资源,并在锁住的过程中进行 sleep 操作,以便模拟资源的占用。 5. synchronized 块的使用:在 Java 中,synchronized 块可以用来锁住一个对象,以便实现线程...

    linux下多线程模拟实验

    在这个"Linux下多线程模拟实验"中,我们将深入探讨如何使用C语言在Linux环境下实现生产者-消费者问题,这是一个经典的线程同步问题。 生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享...

    linux下 多线程模拟进程调度多线程模拟进程调度

    而`多线程模拟进程调度.rar`可能是一个包含更多详细资料的压缩包,包括代码、实验指导和可能的解决方案。 在学习这个主题时,不仅要理解理论,还要通过实践加深理解。分析和修改提供的代码示例,尝试创建自己的调度...

    操作系统设计 多线程同步模拟(C++版)

    5. **临界区(Critical Section)**:保护一小段代码,确保在同一时间只有一个线程可以执行这段代码。 在MFC中,`CMutex`、`CSemaphore`、`CEvent`和`CCriticalSection`类分别对应上述同步机制。通过合理使用这些同步...

    ThreadSwitch_滴水_threadswitch_线程切换_

    9. **线程安全**:线程安全是指代码在多线程环境下正确工作的能力。线程不安全的代码可能导致数据竞争、脏读等问题。开发人员应确保对共享资源的操作是线程安全的。 10. **性能优化**:过度的线程切换会降低系统...

    线程练习代码下载即测

    提供的"线程测试练习代码"可能包含了上述知识点的实践案例,如简单的线程启动、线程同步示例,或者是线程通信的模拟。通过运行和分析这些代码,你可以加深对线程理解,提高处理并发问题的能力。记住,理论知识结合...

    C# 操作系统 模拟线程调度 源代码

    这个资源提供了模拟操作系统线程调度的源代码,通过学习和理解这些代码,开发者可以深入理解线程如何在系统中分配和执行。下面将详细讨论相关知识点。 1. **线程调度**:线程调度是操作系统核心功能之一,负责决定...

    死锁避免——银行家算法的模拟实现 java源代码

    总的来说,通过银行家算法的模拟实现,我们可以深入理解死锁避免机制,学习如何在多线程环境中合理分配和管理资源,以及如何预防和解决潜在的死锁问题。这对于提升软件系统的可靠性具有重要意义。

    Java实现线程死锁

     春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Synchronized关键字,于是自己定义了两个资源模拟了一下。后面想想肠子都悔青了,于是自己在电脑上...

    DELPHI真正的多线程代码

    "DELPHI真正的多线程代码"这个资源提供了一个强大的线程库,解决了Delphi原生线程实现的一些问题,使得开发者能够更好地理解和利用多线程的优势。 1. **什么是多线程**:多线程是并发执行的机制,允许一个应用程序...

    多线程下载模拟高频阻断源码

    然而,也需要处理好线程间的同步与通信,以避免竞态条件和死锁等问题。 3. **下载管理**:在模拟下载场景中,可能涉及到分块下载、断点续传和下载速度控制等策略。多线程下载通常将大文件分割成小块,由多个线程...

    Java 线程死锁的问题解决办法

    在上面的代码模拟中,我们可以看到 DeadLockThread1 和 DeadLockThread2 两个线程,它们之间相互等待锁定的资源obj 和 obj1,从而造成了线程死锁。 二、线程死锁的检测: 要检测线程死锁,我们可以使用 jconsole ...

    基于Linux C语言的多线程模拟智能家具服务器源代码

    6. **线程安全**:由于多线程环境下可能出现竞态条件和死锁,因此在设计时必须考虑到线程安全。这可能涉及到互斥锁(mutex)、信号量、条件变量等同步机制,确保共享资源的安全访问。 7. **错误处理**:一个健壮的...

    基于java swing的多线程电梯调度模拟

    在这个电梯模拟中,电梯线程需要同步访问电梯状态和请求队列,以防止数据竞争和死锁问题。 Java 11作为开发环境,引入了一些新的特性和改进,例如局部变量类型推断(var关键字)、HTTP客户端API、JShell(即时...

    终止线程的源代码资源

    在编程领域,线程是程序执行的最小单元,它允许一个程序同时执行多个任务。在多线程环境中,有时我们需要强制结束某个线程,这通常被称为“终止...在编写多线程代码时,充分理解线程的生命周期和终止策略是至关重要的。

    多线程生命模拟程序

    通过深入研究这个源码,开发者可以提升自己的多线程编程技巧,了解如何将理论上的生命模拟概念转化为实际的代码,并学习到如何结合图形资源创建生动的交互式应用程序。同时,这也是一个很好的实践案例,帮助理解面向...

Global site tag (gtag.js) - Google Analytics