多线程面试题

作者: 大数据阶梯之路 | 来源:发表于2019-02-15 23:31 被阅读4次

1、什么是多线程?

一个线程就相当于一个程序中的一个运行片段,多线程指的就是多个线程同时执行。
即在一个应用程序中,同时有多个不同的执行路径。

2、多线程的作用?

  • 发挥多核CPU的优势。(现如今电脑都是多核CPU的,如果是单线程程序,在双核CPU中就是浪费50%资源,所以多线程编程可以充分利用CPU,但需要注意:在单核CPU电脑中采用多线程编程的话实际上是假的,其实就是线程之间切换得快,所以才看起来像多线程“同时运行”一样。)
  • 防止阻塞。(这也是为什么在单核CPU电脑有必要使用多线程,多个线程同时运行,避免一线程阻塞,影响其他任务的运行。)
  • 便与建模。(通过把一个大的任务程序分解成许多小的程序模型,再通过多线程分别运行这些小的任务就解决了需要建立整个任务程序模型的困难。)
    最主要的一点好处是多线程大大提高了程序效率

3、线程与进程的区别?

进程是计算机资源分配的基本单位,线程是CPU调度的基本单位。另外,一个进程至少包含一个线程,并且线程无法离开进程独立存在,即进程死掉,线程也将死掉。线程有独立的堆栈和局部变量,但无独立的地址空间。

4、什么是线程同步和异步?

线程同步指的是当前线程执行结束后下一个线程才接着执行。而线程异步指的是当前线程执行一半时,下一个线程也可执行,再返回通知继续执行那个线程。比如Javaweb的ajax技术,Android的handler技术。

5、线程之间如何使用同步?多线程之间如何通信?

使用synchronized关键字、调用wait方法、调用notify方法。 (PS:以下不重复造轮子,直接以外链的形式贴出解释。)
有关synchronized关键字的详细分析使用看这篇文章
有关wait方法和notify方法的详细分析使用看这篇文章
总结:synchronized是用来获取锁来占用临界区的。而wait方法是使当前线程阻塞,并且释放锁,所以前提必须是已经获得锁,常配合synchronized关键字使用。notify方法是唤醒沉睡的(处于等待状态的)线程,但不会立即释放锁。

6、Java实现多线程有哪种方式?

  • ① 通过继承Thread类,重写run()方法,再启动start()方法。
  • ② 通过实现Runnable接口,重写run()方法,再启动start()方法。
    推荐使用第二种方式:因为Java的继承是单一继承,所以通过实现接口方式的同时,还可以继承其他类。

*7、什么是线程不安全?如何解决?

就是在多个线程共享同一个数据会受到其他线程的干扰。
解决方案:使用锁(synchronized),让一个线程执行完再接着另一个线程执行。

*8、sleep()与wait()的区别?

sleep()方法是使当前线程休眠一段时间然后再继续执行,不释放锁。而wait()方法是使当前线程阻塞,处于等待状态,会释放锁,直到notify()方法唤醒那线程才继续工作。

9、什么是死锁?如何避免?

死锁就是两个线程互相等待对方释放对象锁。
两种避免方案:
①如果一个进程的请求会导致死锁,则不启动此进程。
②如果一个进程增加的资源请求会导致死锁,则不允许此分配。(即银行家算法)

未完待续~~~

相关文章

网友评论

    本文标题:多线程面试题

    本文链接:https://www.haomeiwen.com/subject/srtveqtx.html