[转帖]Java 面试:三个编程问题和答案_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3444 | 回复: 0   主题: [转帖]Java 面试:三个编程问题和答案        下一篇 
liulin_2
注册用户
等级:少校
经验:1143
发帖:85
精华:5
注册:2012-12-10
状态:离线
发送短消息息给liulin_2 加好友    发送短消息息给liulin_2 发消息
发表于: IP:您无权察看 2012-12-11 10:15:20 | [全部帖] [楼主帖] 楼主

面试是痛苦的,让人发毛的,尤其是技术面试,心跳加速有木有,手心里全是汗有木有,面对白板脑子一片空白有木有???
俗话说,有备无患。下面就让我们来看三个常见的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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论