java 面试题摘要

5.1 什么是线程

  线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位,

  可以使用多线程对运算提速。

5.2 线程和进程有什么区别

 (1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单位

 (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程

 (3)进程的创建需要fork或者vfork,而线程的创建用ptheread create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同一个进程中其他线程的结束

 (4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的

   (5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源。

5.3 如何在 Java 中使用新线程

  java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,

  由于线程类本身就是调用的Runnable接口所以你可以继承 java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。

5.4 start() 和 run() 有什么区别

 (1)run 只是运行这个方法,并不会开启一个新的线程

 (2)start是开启一个新线程,并且运行run方法

5.5 Thread.join 方法有什么用

  Thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

5.6 假如新建T1、T2、T3三个线程,如何保证它们按顺序执行?

  (1)使用 Thread.join 方法

  (2)使用 synchronized 关键字

  (3)使用 ReenreantLock类    

          ReentrantLock() : 创建一个ReentrantLock实例

          lock() : 获得锁

          unlock() : 释放锁

5.7 volatile 变量是做什么的

  volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级

5.8 如果一个线程中发生了异常会怎么样

     ① 如果该异常被捕获或抛出,则程序继续运行。 
  ② 如果异常没有被捕获该线程将会停止执行

5.9 什么是 ThreadLocal 变量

  ThreadLocal变量就是和线程绑定的变量.实际上是一个Map,,,key是对应的线程,值则是该变量. 调用ThreadLocal的get方法时则会到Map中查询当前线程是否已拥有该变量,如果没有则新建一个并保存到Map中.有的话直接返回与该线程绑定的变量.

5.10 什么是线程池,为什么要使用

  (1)线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,线程池主要用来解决线程生命周期开销问题和资源不足问题

  (2)为什么要使用:

    (1)提高重用性

    (2)减少开支

    (3)控制线程池的并发数

    (4)便于管理线程

5.11 Thread.sleep 和 wait 方法有什么不同

  (1)sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。

  (2)wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

  (3)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

  (4)sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

5.12 synchronized 关键词是做什么的

  (1)这个关键字用于修饰方法。它的原理是:被sychronized关键词修饰的方法,在调用对象的时候,会独占该对象,在方法执行结束之前,不允许其它方法使用该对象。

5.12 volatile 关键字 

  当一个共享变量被volatile修饰时,它会保证修改的值立即被更新到主存“。

  volatile特性

  内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。

  volatile的使用场景

  通过关键字sychronize可以防止多个线程进入同一段代码,在某些特定场景中,volatile相当于一个轻量级的sychronize,因为不会引起线程的上下文切换,但是使用volatile必须满足两个条件:

  1、对变量的写操作不依赖当前值,如多线程下执行a++,是无法通过volatile保证结果准确性的;

  2、该变量没有包含在具有其它变量的不变式中。

posted @ 2018-08-13 20:08  追梦滴小蜗牛  阅读(201)  评论(0编辑  收藏  举报