范文无忧网面试笔试面试回答

Java程序员面试中的多线程问题

03月31日 编辑 fanwen51.com

[程序员递归面试问题及解析]面试例题 2:八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是 19 世纪著名的数学家高斯 1850 年提出:在 88 格的国际象棋盘上摆放 8 个皇后,使其不能互相攻击,...+阅读

0、Ja中多线程同步是什么?在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Ja线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。

1、解释实现多线程的几种方法?一Ja线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。

2、Thread.start()与Thread.run()有什么区别?Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。

3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗?我们需要run()start()这两个方法是因为JVM创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的Ja的多继承问题。

4、什么是ThreadLocal类,怎么使用它?ThreadLocal是一个线程级别的局部变量,并非本地线程。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。下面是线程局部变量(ThreadLocal variables)的关键点:一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独的变量。ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。当多个线程访问ThreadLocal实例时,每个线程维护ThreadLocal提供的独立的变量副本。常用的使用可在DAO模式中见到,当DAO类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)

5、什么时候抛出InvalidMonitorStateException异常,为什么?调用wait()/notify()/notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出IllegalMonitorStateException的异常(也就是说程序在没有执行对象的任何同步块或者同步方法时,仍然尝试调用wait()/notify()/notifyAll()时)。由于该异常是RuntimeExcpetion的子类,所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为RuntimeException,此类异常不会在wait(),notify(),notifyAll()的方法签名提及。

6、Sleep()、suspend()和wait()之间有什么区别?Thread.sleep()使当前线程在指定的时间处于非运行(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了 interrupt()方法,它将唤醒那个睡眠的线程。注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。object.wait()使当前线程出于不可运行状态,和sleep()不同的是wait是object的方法而不是thread。调用 object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep() /interrupt()类似,只是前者需要获取对象锁。

7、在静态方法上使用同步时会发生什么事?同步静态方法时会获取该类的Class对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。

8、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Ja没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据Ja照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。下面有一个示例说明:mon类有两个方法synchronizedMethod1()和method1(),MyThread类在独立的线程中调用这两个方法。public class mon {public synchronized void synchronizedMethod1() {System.out.println(synchronizedMethod1 called);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(synchronizedMethod1 done);}public void method1() {System.out.println(Method 1 called);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Method 1 done);}}public class MyThread extends Thread {private int id = 0;private mon mon;public MyThread(String name, int no, mon object) {super(name);mon = object;id = no;}public void run() {System.out.println(Running Thread + this.getName());try {if (id == 0) {mon.synchronizedMethod1();} else {mon.method1();}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {mon c = new mon();MyThread t1 = new MyThread(MyThread-1, 0, c);MyThread t2 = new MyThread(MyThread-2, 1, c);t1.start();t2.start();}}这里是程序的输出:

延伸阅读:

java程序员面试自我介绍自我介绍是向别人展示你自我介绍好不好。下面是ja程序员面试自我介绍,一起来看一下吧。 ja程序员面试自我介绍 ja程序员应试者应充分利用各种个人资源。想了解ja程序员面试指...

程序员面试自我介绍优秀模板确定自我介绍的具体内容,应兼顾实际需要、所处场景,并应具有鲜明的针对性,切不可“千人一面”,一概而论。以下是本站网小编为你提供的程序员面试自我介绍优秀模板,供大家参考。...

java线程面试题一、线程的四种状态 1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。 2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执...

程序员在面试中如何占据主动其实,面试是一个双向选择的过程(如果你不这么认为,说明你还不够自信),你大可不必在面试中完全处于被动,相反,你也可以问面试官一些问题,以便看看这个公司是否合你胃口比如,你可以问...

php程序员面试经历(一) 明天还有两场面试,本来想着早点休息的,可是纠结了一番,还是决定写下此文。 因为对深圳的环境还是不太熟悉,即使早上的面试时间是十点半,可我还是七点十五分起床了,然后刷牙洗...

名企招聘C++程序员笔试题名企招聘C++程序员笔试题 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1-2-3-4-5 通过反转后成为5-4-3-2-1。 最容易想到的...

了解程序员面试技巧在开始求职之前,需要做一些准备工作。比方说要知道自己喜欢什么东西而去求职,否则是没有意义的。仅仅成为一名好的编码人员是不够的,你必须理解市场想要的是什么,如何提高自己的...

程序员自我介绍简历程序员面试自我介绍【1】 我叫xxx,今年21岁,毕业于xx解放军信息工程大学计算机科学与技术专业,拥有扎实的core ja基础,良好的编程风格;熟悉jsp+servlet+jabean模式的web开发;熟...

如何面试ios程序员1、面试的目的 求职者通过表现证明自己对岗位的胜任 公司通过面试找到符合职位需求的员工 面试者面试的表现影响着公司用人选择,对于软件工程师,我的感觉技术面试往往是天王山...

推荐阅读
图文推荐
栏目列表