最近两天研究内部类,编写小测试的时候发现一个问题,比较有趣,可以称为内部类中死锁,造成外部类和内部类都无法初始化。
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。
分享到:
相关推荐
这种便捷性对于数据库管理员来说非常宝贵,他们无需深入了解工具的内部机制,也能快速定位和处理死锁问题。 标签“SQL 死锁 解除”表明这个工具专注于SQL(Structured Query Language)环境下的死锁问题。SQL是用于...
在查询方式中,主站定期轮询所有子站,如果发送和接收的数据不符或子站无响应,就可能初步判断为死锁。而在CSMA/CD方式下,主站通过硬件监测信号线A和B的电压差来判断死锁,例如,当信号线A比B高0.2V以上时,表明...
1. 不正确的事务设计:事务内部的逻辑顺序可能导致死锁。例如,事务A先锁住表A,然后试图锁住表B,而事务B则是先锁住表B再试图锁住表A。 2. 长事务:长时间运行的事务可能会占用大量资源,增加其他事务等待的时间,...
3. **使用工具类**:例如`ReentrantReadWriteLock`等高级锁,这些工具类内部已经实现了防止死锁的功能。 4. **死锁检测**:定期检测系统中是否存在死锁情况,一旦发现死锁立即采取措施(如释放部分锁)来解除死锁。 ...
在Oracle数据库系统中,死锁是指两个或多个...综上所述,处理Oracle死锁需要深入了解数据库的内部机制,并结合适当的监控和预防措施。通过有效的诊断和管理,我们可以减少死锁的发生,从而提高数据库的性能和可用性。
MySQL通过内部机制自动检测死锁。当检测到死锁时,通常会选择回滚其中一个事务来解除死锁。可以通过查询`INFORMATION_SCHEMA.INNODB_TRX`表来查看当前活跃的事务信息,包括事务的状态、开始时间、等待锁的信息等。 ...
死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。这种情况在数据库系统中是需要避免的,因为它可能导致数据一致性问题,甚至引发系统性能下降。本篇...
这类方法通常包括预防死锁、避免死锁和检测与恢复死锁三类: 1. 预防死锁:通过设计网络资源分配策略,确保不会出现循环等待条件,例如,使用银行家算法预先分配资源,或者限制网络中数据包的持有时间。 2. 避免...
在数据库系统中,特别是在Oracle这样的大型关系型数据库管理系统中,死锁是常见的问题之一。当两个或多个事务互相等待对方释放资源时,就会发生死锁。这种情况下,所有涉及的事务都将处于无限等待状态,从而导致应用...
在SQL Server数据库管理系统中,死锁是一个常见的问题,它发生在两个或多个事务之间,每个事务都在等待对方释放资源,导致所有事务都无法继续执行。本文将深入探讨SQL Server死锁的概念、原因、检测方法以及如何有效...
1. 避免嵌套事务:尽量避免在一个事务内部启动另一个事务,这可以降低死锁的概率。 2. 事务排序:确保所有事务在访问资源时遵循相同的顺序,减少循环等待的可能性。 3. 设置合适的超时:通过调整`innodb_lock_wait_...
线程死锁是多线程编程中一个严重的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。CPU过高通常与过度的计算、无尽循环、死锁、线程竞争状态等问题相关。在Java编程中,WeakHashMap是一...
在这个案例中,虽然存在两个线程对同一张表进行操作,但由于其中一个线程的事务在一个循环中执行,而循环体内部并没有对循环变量进行修改,因此理论上不会发生死循环。然而,在实际情况中仍然出现了死锁现象。 **...
在REPEATABLE READ级别,Next-Key Lock的作用更为明显,因为它保证了事务内部的读一致性,即事务在整个执行过程中看到的数据保持不变。如果两个事务试图插入相同的唯一值,它们可能会相互阻塞,导致死锁。 REPLACE...
内部类(也称为嵌套类)是Java中一个高级特性,允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这为设计复杂的面向对象结构提供了便利。内部类分为四种类型:成员内部类、局部内部...
SQL Server具有内部机制来检测死锁。当系统发现死锁时,它会选择一个牺牲品(即其中一个进程),并终止该进程以解决死锁。在SQL Server 2000中,这个机制是通过系统的监控后台进程来实现的。 3. 自动杀死死锁进程...
在.NET框架中,SerialPort类为我们提供了与串行端口进行通信的能力。然而,对于初学者和经验丰富的开发者来说,它隐藏的一些陷阱可能导致程序出现意想不到的死锁问题。本文将深入探讨这些问题,并提供解决方案,帮助...
死锁通常指的是两个或多个进程(在 Linux 内核中通常指的是任务)因争夺资源而造成的互相等待现象,即每个进程都在等待另一个进程释放它所需的资源,从而导致所有相关进程都无法继续执行。 Linux 内核中的死锁主要...
实验中,你将找到一个C语言实现的银行家算法程序,该程序包含了详细注释和变量解释,这有助于理解算法的内部工作原理。例如,`max`数组记录了每个进程对资源的最大需求,`alloc`数组表示当前已分配给每个进程的资源...