`
yushu1987
  • 浏览: 16539 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

内部类中的死锁

 
阅读更多
    最近两天研究内部类,编写小测试的时候发现一个问题,比较有趣,可以称为内部类中死锁,造成外部类和内部类都无法初始化。
package Thinking;

public class InnerClass{
	Inner inner;
	public class Inner{
		int i;
		String name;
		public Inner(int i,String name){
			this.i=i;
			this.name=name;
		}
		public int geti(){
			return i;
		}
		public String getname(){
			return name;
		}
	}
	public InnerClass(Inner inner){
                  if(inner!=null)
		   this.inner=inner;
	}
	
	public static void main(String[] args){
	}
}

    外部类中定义了一个内部类域,而且相对应的重定义了构造方法,使用内部类域作为构造器的参数。因为在拥有外部类对象之前不可能创建内部类对象,所以外部类对象应该先创建,而外部类的构造器却包含一个内部类对象,所以造成了一种死锁。都无法创建实例对象。
    当然这种问题不是没有解决的办法,我们可以在main函数中先定义一个Inner的空应用对象,然后代用外部类的构造函数,但这种方法称为无效初始化。个人认为比较好的方法是有两种,一是在无效初始化之后,再创建内部类对象,最后对内部类应用赋值。二是添加一个set方法,设置该内部类域。
方法一:
package Thinking;

public class InnerClass{
	Inner inner;

	public class Inner{
		int i;
		String name;
		public Inner(int i,String name){
			this.i=i;
			this.name=name;
		}
		public int geti(){
			return i;
		}
		public String getname(){
			return name;
		}
	}

	public InnerClass(Inner inner){
		if(inner!=null)
		this.inner=inner;
	}
	
	public static void main(String[] args){
		Inner a=null;
		InnerClass b=new InnerClass(a);
		System.out.println(b.inner);
		b.inner=b.new Inner(1,"hust");
		System.out.println(b.inner);
	}
}
//output
null
Thinking.InnerClass$Inner@4f1d0d

如果是外部文件访问,这种方法要求inner的访问权限较高。
方法二:
package Thinking;

public class InnerClass{
	Inner inner;
	
	public class Inner{
		int i;
		String name;
		public Inner(int i,String name){
			this.i=i;
			this.name=name;
		}
		public int geti(){
			return i;
		}
		public String getname(){
			return name;
		}
	}
	
	public InnerClass(Inner inner){
		if(inner!=null)
		this.inner=inner;
	}
	
	public void setInner(Inner inner){
		this.inner=inner;	}
	
	public static void main(String[] args){
		Inner a=null;
		InnerClass b=new InnerClass(a);
		System.out.println(b.inner);
		b.setInner(b.new Inner(1,"hust"));
		System.out.println(b.inner);
	}
}
//output
null
Thinking.InnerClass$Inner@4f1d0d

这种方法可以保证inner的访问权限为private,保护inner。
分享到:
评论
5 楼 yushu1987 2011-05-19  
    通过四楼大牛的指点以及网上资料的查阅,我发现我的代码存在两个问题。第一,不清楚内部类存在的机制与原因。第二,对死锁的定义很模糊。大家就当这段代码是个游戏吧。
4 楼 Technoboy 2011-05-19  
好好研究下内部类和匿名类存在的原因,死锁可以百度一下或者http://technoboy.iteye.com/blog/1039421
3 楼 Technoboy 2011-05-18  
死锁的含义?
内部类的意义?
2 楼 chrhust 2011-05-18  
哦,无法创建实例~~
1 楼 chrhust 2011-05-18  
but,第一段程序在我机子上没有出现死锁~~

相关推荐

    死锁查找与排除工具

    这种便捷性对于数据库管理员来说非常宝贵,他们无需深入了解工具的内部机制,也能快速定位和处理死锁问题。 标签“SQL 死锁 解除”表明这个工具专注于SQL(Structured Query Language)环境下的死锁问题。SQL是用于...

    RS-485 总线的死锁检测与解除

    在查询方式中,主站定期轮询所有子站,如果发送和接收的数据不符或子站无响应,就可能初步判断为死锁。而在CSMA/CD方式下,主站通过硬件监测信号线A和B的电压差来判断死锁,例如,当信号线A比B高0.2V以上时,表明...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    1. 不正确的事务设计:事务内部的逻辑顺序可能导致死锁。例如,事务A先锁住表A,然后试图锁住表B,而事务B则是先锁住表B再试图锁住表A。 2. 长事务:长时间运行的事务可能会占用大量资源,增加其他事务等待的时间,...

    非常经典的死锁演示代码

    3. **使用工具类**:例如`ReentrantReadWriteLock`等高级锁,这些工具类内部已经实现了防止死锁的功能。 4. **死锁检测**:定期检测系统中是否存在死锁情况,一旦发现死锁立即采取措施(如释放部分锁)来解除死锁。 ...

    解决oracle死锁

    在Oracle数据库系统中,死锁是指两个或多个...综上所述,处理Oracle死锁需要深入了解数据库的内部机制,并结合适当的监控和预防措施。通过有效的诊断和管理,我们可以减少死锁的发生,从而提高数据库的性能和可用性。

    mysql死锁解决

    MySQL通过内部机制自动检测死锁。当检测到死锁时,通常会选择回滚其中一个事务来解除死锁。可以通过查询`INFORMATION_SCHEMA.INNODB_TRX`表来查看当前活跃的事务信息,包括事务的状态、开始时间、等待锁的信息等。 ...

    mysql死锁的一些案例

    死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。这种情况在数据库系统中是需要避免的,因为它可能导致数据一致性问题,甚至引发系统性能下降。本篇...

    网络游戏-一种检测片上网络中死锁的方法.zip

    这类方法通常包括预防死锁、避免死锁和检测与恢复死锁三类: 1. 预防死锁:通过设计网络资源分配策略,确保不会出现循环等待条件,例如,使用银行家算法预先分配资源,或者限制网络中数据包的持有时间。 2. 避免...

    查出、删除死锁对象

    在数据库系统中,特别是在Oracle这样的大型关系型数据库管理系统中,死锁是常见的问题之一。当两个或多个事务互相等待对方释放资源时,就会发生死锁。这种情况下,所有涉及的事务都将处于无限等待状态,从而导致应用...

    SQL SERVER 死锁的解决之道

    在SQL Server数据库管理系统中,死锁是一个常见的问题,它发生在两个或多个事务之间,每个事务都在等待对方释放资源,导致所有事务都无法继续执行。本文将深入探讨SQL Server死锁的概念、原因、检测方法以及如何有效...

    MYSQL 数据库死锁

    1. 避免嵌套事务:尽量避免在一个事务内部启动另一个事务,这可以降低死锁的概率。 2. 事务排序:确保所有事务在访问资源时遵循相同的顺序,减少循环等待的可能性。 3. 设置合适的超时:通过调整`innodb_lock_wait_...

    线程死锁CPU过高,请求原因分析

    线程死锁是多线程编程中一个严重的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。CPU过高通常与过度的计算、无尽循环、死锁、线程竞争状态等问题相关。在Java编程中,WeakHashMap是一...

    数据库死锁案例

    在这个案例中,虽然存在两个线程对同一张表进行操作,但由于其中一个线程的事务在一个循环中执行,而循环体内部并没有对循环变量进行修改,因此理论上不会发生死循环。然而,在实际情况中仍然出现了死锁现象。 **...

    MySQL REPLACE死锁问题深入剖析1

    在REPEATABLE READ级别,Next-Key Lock的作用更为明显,因为它保证了事务内部的读一致性,即事务在整个执行过程中看到的数据保持不变。如果两个事务试图插入相同的唯一值,它们可能会相互阻塞,导致死锁。 REPLACE...

    Chp10 Object类与常用类,内部类.pdf

    内部类(也称为嵌套类)是Java中一个高级特性,允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这为设计复杂的面向对象结构提供了便利。内部类分为四种类型:成员内部类、局部内部...

    sqlserver2000中如何自动杀死死锁进程.pdf

    SQL Server具有内部机制来检测死锁。当系统发现死锁时,它会选择一个牺牲品(即其中一个进程),并终止该进程以解决死锁。在SQL Server 2000中,这个机制是通过系统的监控后台进程来实现的。 3. 自动杀死死锁进程...

    微软SerialPort秘籍[SerialPort为什么死锁程序的分析]

    在.NET框架中,SerialPort类为我们提供了与串行端口进行通信的能力。然而,对于初学者和经验丰富的开发者来说,它隐藏的一些陷阱可能导致程序出现意想不到的死锁问题。本文将深入探讨这些问题,并提供解决方案,帮助...

    linux 内核死锁检测

    死锁通常指的是两个或多个进程(在 Linux 内核中通常指的是任务)因争夺资源而造成的互相等待现象,即每个进程都在等待另一个进程释放它所需的资源,从而导致所有相关进程都无法继续执行。 Linux 内核中的死锁主要...

    安徽大学操作系统实验(三)银行家算法避免死锁,C语言编写,环境vs2008,已经调试过可运行,含实验报告,含具体流程图 ,内有详细注释和变量解释

    实验中,你将找到一个C语言实现的银行家算法程序,该程序包含了详细注释和变量解释,这有助于理解算法的内部工作原理。例如,`max`数组记录了每个进程对资源的最大需求,`alloc`数组表示当前已分配给每个进程的资源...

Global site tag (gtag.js) - Google Analytics