面试是痛苦的,让人发毛的,尤其是技术面试,心跳加速有木有,手心里全是汗有木有,面对白板脑子一片空白有木有???
俗话说,有备无患。下面就让我们来看三个常见的Java面试题吧。
1. sleep() 和 wait() 的区别是什么?他们分别如何使用?
这个问题是一个很好的面试开场的问题,因为通过它可以大致了解面试者的水平。如果你从来没有用过线程,那么你应该也从来没有接触过 sleep() 和 wait()。它们的区别如下:
“wait()”方法是用来告诉线程在一定的时间内释放锁,这个时间是传入的参数。最常见的用法是你有另外一个线程要运行,让当前的线程 wait()。“wait()”有三种调用方法,“wait(), wait(long timeout), wait(long timeout, int nanos)”,其中 timeout 是以毫秒记的,nanos 是以微秒记的。“wait()”不能在其他线程中调用,它必须在拥有锁的那个线程中调用。
所有调用 wait() 的线程都不会参与线程调度,除非等待的时间到了。在某些不限时间的 wait() 情况下,只有在调用 notify() 或者 notifyAll() 的情况下,线程才会重新运行。
下面是一个 wait() 的用例:
1
synchronized(myObject) {
2
while(myObject.isEmpty()) {
3
myObject.wait();
4
}
5
6
returnmyObject.remove(0);
7
}
“wait()”必须在synchronized上下文中被调用,因为上面说过的原因“wait() 只能在本线程中调用”。在这个例子中,我们通过“isEmpty()”来判断是否需要等待,我们没有指定等待时间,所以等待会一直持续直到 notify() 被调用。
"sleep()"和“wait()”其实是两个完全不同的概念。调用 sleep() 会让当前线程休眠一段时间,它常常用来控制程序运行的节奏,或者用来等待其他线程结束。
“sleep()” 必须指定时间,例如:
01
String myMessages[] = {
02
"Mary had a little lamb",
03
"His fleece was white as snow",
04
"Everywhere that Mary went",
05
"The lamb was sure to go"
06
};
07
08
for(inti =0; i < myMessages.length; i++) {
09
// pause for five seconds between each line
10
Thread.sleep(5000);
11
12
// print one of the lines
13
System.out.println(myMessages[i]);
14
}
当然 sleep() 的线程也是可以被其他操作打断的,例如调用线程的 interrupt() 方法。
2. 什么是 Synchronization,如何使用?
Synchronization 是在多线程编程的时候用来控制对共享资源的访问的。在进行多线程编程的时候,不同的线程往往需要对同一个资源进行访问,但这些资源在同一时间只允许一个线程访问。为了防止数据混乱和线程之间的竞争,syncrhonization可以让资源的访问有序的进行。
因为synchronization是一个常用的开发技巧,所以很多面试都会问到这个问题。如果你要去面试的话,一定要准备一下synchronization相关的知识。
其实synchronization用起来很简单,你只要在相应的方法前加上“synchronized”关键词就可以了,这样这个方法在同一时间就只能被一个线程访问了。例如:
1
publicclassCounting {
2
publicstaticsynchronizedcount() {
3
returnthis.count;
4
}
5
6
publicstaticsynchronizedmyCounter(intcount) {
7
this.count = count;
8
}
9
}
很简单吧?这两个方法都是静态的,且都是synchronized,所以这两个方法都会对“this.count”加锁,所以一次就只能有一个线程访问 this.count 变量了。
3. 请问 final 关键词如何使用?
“final”关键词并不是很常用,所以很多新手对它都不熟悉,所以很多面试就会问这个问题。
“final”可以用来修饰变量,方法,类。这个关键词是用来阻止被修饰的对象被修改,覆盖或者继承。你可以用final关键词来保证变量不会被篡改。如果是匿名类的话,必须用final修饰。最常用final的地方就是一些标志性常量定义,通常和static一起用。下面来看几个例子:
首先是用final修饰的变量不可以修改,例如:
1
finalintmyInt =1;// creates a constant integer
2
myInt =5;// not allowed
但是你也要知道final的变量可以被赋值一次,那就是在构造函数里面,例如:
01
publicclassMyFinalClass {
02
privatefinalintmyInt =1;
03
}
04
05
publicclassMyFinalClass {
06
privatefinalintmyInt;
07
08
publicMyFinalClass() {
09
myInt =1;
10
}
11
}
也就是说final的变量只可以在两个地方赋值,一个是在定义它的时候,另外一个是在构造函数中。
该贴被liulin_2编辑于2012-12-11 10:22:01