荟萃馆

位置:首页 > 计算机 > java语言

Java设计常见问题

java语言1.37W

导语:Java可以编写桌面应用程序、Web应用程序、分布式系统嵌入式系统应用程序等。下面是Java设计的常见问题,欢迎参考!

Java设计常见问题

  1、什么时候抛出InvalidMonitorStateException异常?为什么?

调用 wait ()/notify ()/notifyAll ()中的任何一个方法时,如果当前线程没有获得该对象的锁,

那么就会抛出 IllegalMonitorStateException 的.异常

也就是说程序在没有执行对象的任何同步块或者同步方法时,

仍然尝试调用 wait ()/notify ()/notifyAll ()时。由于该异常是 RuntimeExcpetion 的子类,

所以该异常不一定要捕获(尽管你可以捕获只要你愿意

作为 RuntimeException,此类异常不会在 wait (),notify (),notifyAll ()的方法签名提及。

  2、在静态方法上使用同步时会发生什么事?

同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,

线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。

它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。

  3、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?

可以,一个非同步方法总是可以被调用而不会有任何问题。

实际上,Java 没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。

如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,

所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),

如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

  4、在一个对象上两个线程可以调用两个不同的同步实例方法吗?

不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。

所以只有执行完该方法释放对象锁后才能执行其它同步方法。

  5、什么是线程饿死,什么是活锁?

线程饿死和活锁虽然不像死锁一样是常见的问题,但是对于并发编程的设计者来说就像一次邂逅一样。

当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。

JavaAPI 中线程活锁可能发生在以下情形:

当所有线程在程序中执行 (0),参数为 0 的 wait 方法。

程序将发生活锁直到在相应的对象上有线程调用 fy ()或者 fyAll ()。

当所有线程卡在无限循环中。

标签:常见问题 JAVA