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

面试试题 2021-05-04 网络整理 可可

【jianli.jxxyjl.com--面试试题】

  0、java中多线程同步是什么?

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

  1、解释实现多线程的几种方法?

  一java线程可以实现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类而造成的java的多继承问题。

  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、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?

  可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,java没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据java照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

  下面有一个示例说明:common类有两个方法synchronizedmethod1()和method1(),mythread类在独立的线程中调用这两个方法。

  public class common {

  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 common common;

  public mythread(string name, int no, common object) {

  super(name);

  common = object;

  id = no;

  }

  public void run() {

  system.out.println("running thread" + this.getname());

  try {

  if (id == 0) {

  common.synchronizedmethod1();

  } else {

  common.method1();

  }

  } catch (exception e) {

  e.printstacktrace();

  }

  }

  public static void main(string[] args) {

  common c = new common();

  mythread t1 = new mythread("mythread-1", 0, c);

  mythread t2 = new mythread("mythread-2", 1, c);

  t1.start();

  t2.start();

  }

  }

  这里是程序的输出:

  running threadmythread-1

  synchronizedmethod1 called

  running threadmythread-2

  method 1 called

  synchronizedmethod1 done

  method 1 done

  结果表明即使synchronizedmethod1()方法执行了,method1()也会被调用。

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

  不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有执行完该方法释放对象锁后才能执行其它同步方法。看下面代码示例非常清晰:common 类 有synchronizedmethod1()和synchronizedmethod2()方法,mythread调用这两个方法。

  public class common {

  public synchronized void synchronizedmethod1() {

  system.out.println("synchronizedmethod1 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("synchronizedmethod1 done");

  }

  public synchronized void synchronizedmethod2() {

  system.out.println("synchronizedmethod2 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("synchronizedmethod2 done");

  }

  }

  public class mythread extends thread {

  private int id = 0;

  private common common;

  public mythread(string name, int no, common object) {

  super(name);

  common = object;

  id = no;

  }

  public void run() {

  system.out.println("running thread" + this.getname());

  try {

  if (id == 0) {

  common.synchronizedmethod1();

  } else {

  common.synchronizedmethod2();

  }

  } catch (exception e) {

  e.printstacktrace();

  }

  }

  public static void main(string[] args) {

  common c = new common();

  mythread t1 = new mythread("mythread-1", 0, c);

  mythread t2 = new mythread("mythread-2", 1, c);

  t1.start();

  t2.start();

  }

  }

  10、 什么是死锁

  死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止。就javaapi而言,线程死锁可能发生在一下情况。

  ●当两个线程相互调用thread.join()

  ●当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必需的锁,互相等待时被阻塞就有可能出现死锁。

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

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

  当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。javaapi中线程活锁可能发生在以下情形:

  ●当所有线程在程序中执行object.wait(0),参数为0的wait方法。程序将发生活锁直到在相应的对象上有线程调用object.notify()或者object.notifyall()。

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

本文来源:https://jianli.jxxyjl.com/mianshishiti/5082.html

  • [美国F1签证面试问题]美国f1签证面试问题

    美国f1签证面试技巧:回答问题的原则  (1)回答问题时用英语,语速可放慢。 如果太快,签证官认为您的英语很好,也因此会加快语速,这样您可能会听不懂。当然,官员有时故意提高说话的速度,来考核您的英语水平。您可以把语速压下来,讲得慢并不是说明英语差,语法要正确。  (2) 回答问题时要简明扼要,态...

    发布于:2021-05-20

    详细阅读
  • 腾讯面试题目答案_腾讯面试题

    请将答卷、作品及简历压缩后发送到:campus@tencent com 邮箱,投递作品请在主题标明:职位+地区+学校+姓名,如:用户研究+北京+北京大学+张三 一、 耐心填一填!(每空4分,共24分) 1 为div设置类a与b,应编写html代码_...

    发布于:2021-05-20

    详细阅读
  • 【应聘面试常见问题及回答技巧】面试问题及回答

    面试问题及回答参考  1、我们为什么要聘用你  (测试你的沉静与自信。)给一个简短、有礼貌的回答:“我能做好我要做的事情、“我相信自己,我想得到这份工作。  2、为什么你想到这里来工作  (这应该是你喜爱的题目。)因为你在此前进行了大量的准备,你了解这家公司。组织几个原因...

    发布于:2021-05-19

    详细阅读
  • 面试中可能被问到的问题英文_面试中可能被问到的问题

    面试中可能被问到的问题  面试随单位和岗位的不同而有很大差别,没有固定的形式、问题和答案,这里所列的只是常见的一些问题和回答的要点,仅供毕业生参考。  (一)关于个人方面的问题  1、请介绍一下你自己  在面试前用人单位大多都看过了毕业生的自荐材料,一些基本情况都有所了解,所以在自我介绍时要简...

    发布于:2021-05-19

    详细阅读
  • 护士应聘面试常见问题及回答|护士面试常见问题及答案

    护士面试常见问题及答案(一)  1、 我们为什么要雇请你呢?  有的面试只有这么一个问题。话虽简单,可是难度颇高。主要是测试你的沉静与自信。给一个简短、有礼貌的回答:我能做好我要做得事情,我相信自己,我想得到这份工作。根据自己的实际情况,好好想想把,看怎么说才具有最高说服力。  2、 你认为...

    发布于:2021-05-19

    详细阅读
  • 江南style小苹果_江南Style成面试题

    江南style成面试题;  18日上午,常州市第一中学的报告厅里坐满了老师和同学,现场的气氛紧张而热烈,这里正在进行XX届清华大学“新百年领军计划”推荐生选拔pk。5名候选人经过个人陈述、现场提问、一分钟总结等3个环节的比拼,最终高三(1)班的***胜出,成为清...

    发布于:2021-05-19

    详细阅读
  • 面试常用问题解析_届面试问题解析

    1、你认为你适合干什么?  一般一个人的选择是从想干什么和能干什么这两个方面着手考虑的,这两点都得到满足才是最佳选择。但现实中不可能都得到最大化的满足。  许多人只从表面上了解工作性质,甚至对自身的了解也流于表面,认为善于交流的人就适合做营销,沉稳的人只适合搞研究。其实,善于交流的人如果不能...

    发布于:2021-05-19

    详细阅读
  • 外贸公司面试题目_外贸公司面试题

    公务员面试总原则  面试时,考生应该坚持自信和沉着。答题时既要实事求是,也要随机应变。具体表现为,考生应该手脚安稳,不乱抖动,两眼平视主考官,注意和考官们的目光交流。面试并不是要像机器人一样表现“完美”,考生可偶尔低头看纸、思考,也可用手势。只要两眼不乱飘,自然地微笑,稳重、...

    发布于:2021-05-18

    详细阅读
  • 产品经理面试会问哪些问题_产品经理面试:哪些问题是你没有准备的?

    产品面试的同学提供一些帮助。  面试问题分为自我介绍、产品基本知识、实习经理和个人经历(共50题)。有些基本的问题,不管你去面试什么公司、什么行业都会问到。建议大家在准备面试之前,准备好你认为做可能问道的50个问题,然后把答案写好,打印出来。然后经常去看看,去修改。  往往你第二天,看昨天写的...

    发布于:2021-05-18

    详细阅读
  • 【车让人面试题】面试题:让你逃税100万,你该怎么做?

    如果您作为财务经理,如果总经理要求您1年之内逃税100万元,您会怎么做?  分析:面对这类问题,如果你抓耳搔腮地思考逃税计谋,或者思如泉涌地立即列举出一大堆方案,你都会中他们的圈套。实际上,主考官这个时候真正考核的不是你的业务能力,而是你的商业判断能力及商业道德方面的素养,因为在几乎所有的国际化...

    发布于:2021-05-18

    详细阅读

Copyright @ 2011-2019 求职简历网 All Rights Reserved. 版权所有

免责声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。

 站长统计