`

Java 多线程例子7 线程安全 死锁

阅读更多

死锁:在多个线程里对多个同步对象具有循环依赖时常会出现死锁。最简单的死锁例子就是线程一得到了A对象的锁旗标想得到B对象的锁旗标,线程二得到了B对象的锁旗标想得到A对象的锁旗标,这样线程一和线程二就形成了死锁。

例子:

 

class ThreadDemo {
	public static void main(String[] args) {
		TestThread t = new TestThread();
		new Thread(t).start();
		try{Thread.sleep(10);}catch(Exception e) {}
		t.flag = true;
		new Thread(t).start();
	}
}

class TestThread implements Runnable {
	boolean flag = false;
	String A=new String("");
	String B=new String("");
//	String A="";
//	String B="";
	
	public void run() {
		System.out.println(A==B);
		if(flag) {
			while(true) {
				synchronized(A) {
					try{Thread.sleep(100);}catch(Exception e) {}
					synchronized(B) {}
				}
				System.out.println("AA...running...");
			}
		} else  {
			while(true) {
				synchronized(B) {
					try{Thread.sleep(100);}catch(Exception e) {}
					synchronized(A) {}
				}
				System.out.println("BB...running...");
				}
		}
	}
}

 

这里启动了两个线程,两个线程都循环想要得到A对象和B对象的锁旗标。

在试验这个例子的时候,还遇到了一个有意思的问题:刚开始我用的A和B对象是这么写的A="";B="";结果死活实验不出来死锁问题,这倒是挺奇怪的。结果最后发现原来这时候A和B引用了同一个对象,这是更java中对字符串常量的处理有关系,A="";时,java会在堆中建立一个字符串常量,这个字符串常量为空,由A引用,在B="",java发现字符串常量中有这么一个空字符串常量就不会新建了。

分享到:
评论
3 楼 酒杯中的大海 2011-03-03  
很好很强大~
2 楼 xmind 2010-12-16  
恩 就是 String 常量的原因
1 楼 cectsky 2010-12-16  
const String Pool~

相关推荐

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点

    Java多线程死锁示例

    主要介绍了Java多线程死锁,结合实例形式分析了Java多线程出现死锁的相关原因与操作注意事项,需要的朋友可以参考下

    哲学家就餐:Java多线程实例图形版

    哲学家就餐:Java多线程实例图形版 哲学家就餐是一个经典的Java多线程编程的实例,这是图形版。涉及到线程同步与互斥,临界区访问问题以及避免死锁的方法。    哲学家就餐:有五个哲学家绕着圆桌坐,每个哲学家...

    Java中死锁的例子

    Java中死锁的例子,非常的例子。经过本人验证

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关...第五章 Java线程编程的例子 第六章 Java线程调度 第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组

    Java多线程管理示例

    里面提供Java多线程的概念,同步,死锁,wait/nofity机制的示例《生产者与消费者》例子

    java 多线程死锁详解及简单实例

    主要介绍了java 多线程死锁详解及简单实例的相关资料,需要的朋友可以参考下

    基于Java的实例源码-多线程程序死锁检查 JCarder.zip

    基于Java的实例源码-多线程程序死锁检查 JCarder.zip

    java多线程代码demo

    这些java的代码demo,是本人几篇多线程文章的实例代码 http://www.cnblogs.com/yaoxiaowen/p/6576779.html

    Java 死锁示例性源代码

    本源代码是博客《Java 多线程编程之七:死锁(附源代码)》附带的实例性源代码。原博客链接地址:http://blog.csdn.net/defonds/archive/2010/01/26/5258120.aspx。

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    JavaMultiThreadingExamples:带有中文注释的基本Java多线程示例

    #Java多线程示例-Java多线程应用实例 1- Java多线程:启动线程 2- Java多线程:易失性–基本线程通信 3- Java多线程:同步 4- Java多线程:锁定对象 5- Java多线程:线程池 6- Java多线程:倒计时闩锁 7- Java多线程...

    java线程详解

    七、线程死锁 八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、...

    讲给女朋友听的java多线程(2万字深入理解多线程,有实例代码辅助理解)

    读完本文大概需要30分钟左右,本文有大量的实例代码和典型例题帮助大家理解java多线程。虽然多线程比较难以理解,仅靠一篇文章恐怕搞不定。但读完本文最起码能让你搞懂java多线程的70%以上,至于熟练运用,还是得...

    基于Java多线程的并发机制的研究和实现

    研究了程序并发过程中的同步机制和交互通信机制,比较了基于操作系统级和基于Java多线程级并发机制的实现结构,总结了并发程序中死锁预防的一些编程规则和策略。所构造的一个具有完全意义上的并发同步的框架实例有...

    java线程死锁代码示例

    主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。

    多线程操作实例源码,,

    浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。  多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望...

    多线程操作实例源码

    浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。  多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望...

Global site tag (gtag.js) - Google Analytics