Java 最常见的 208 道面试题(35-56) -- 多线程部分

35.并行和并发有什么区别?

   并行指的是同一时刻多条指令在多个处理器上同时执行,只能在多处理器中存在
   并发指的是在同一时刻只能有一条指令执行,多个进程快速的轮换执行

36.线程和进程的区别?

   进程是调度运行的基本单位,系统并发执行的单位
   单个进程中执行的每个任务就是一个线程,线程是进程中执行运算的最小单位

37.守护线程是什么?

   守护线程是一类特殊线程,一般是一些提供系统性服务的线程,例如垃圾回收线程,JIT(动态编译)线程
   守护线程需要在线程start()之前设置, 在系统中只有守护线程(用户线程全部结束)是,自动结束

38.创建线程有哪几种方式?

   继承Thread类,重写run()方法,通过start()方法启动
   通过Runable接口创建线程类,重写run()方法,start()启动
   通过Callable和Future创建线程

39.说一下 runnable 和 callable 有什么区别?

   Runnable提供run方法,无法通过throws抛出异常,所有的CheckedException必须在run方法内部处理
   Callable提供call方法,直接抛出Exception异常
 
   Runnable的run方法无返回值,Callable的call方法提供返回值来表示任务运行结果
   
   Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行,
   Callable只能通过线程池执行

40.线程有哪些状态?

   新建 New
   可运行 Runnable
   运行 Running
   阻塞 Blocked
   死亡 Dead

41.sleep() 和 wait() 有什么区别?

   sleep是线程类Thread的方法,调用不会释放对象锁
   wait是Object类的方法,调用wait方法会导致线程放弃对象锁,进入等待此对象的等待锁定池,
       只有该对象调用notify或者notifyAll方法后本线程才会进入对象锁定池运行对象

42.notify()和 notifyAll()有什么区别?

     notify()方法会随机调用该对象的一个线程从等待池进入锁池
     notifyAll()方法会将该对象的所有线程移动到锁池中,等待锁竞争

43.线程的 run()和 start()有什么区别?

   start()方法是用来启动线程的,轮到该线程执行时,会自动调用run
   直接调用run()方法,无法达到启动多线程的目的,相当于主线程执行Thread对象的run()方法

   一个线程的start的方法只能调用一次,多次调用会抛异常,run()方法没有限制

44.创建线程池有哪几种方式?

     newFixedThreadPool            创建一个固定长度的线程池
     newCachedThreadPool         创建一个可缓存的线程池,可自动添加线程,规模无限制,自动回收空闲线程
     newSingleThreadExecutor    创建一个单线程的线程池,确保依照任务在队列的中顺序来串行执行
     newScheduledThreadPool     创建一个定时的线程池,以延迟或定时的方式来执行任务

45.线程池都有哪些状态?

     Running        可以接收新任务,对新添加的任务进行处理
     Shutdown      不再接收新任务,对已添加的任务进行处理
     Stop               不接受新任务,不处理已接受的任务,中断正在处理的任务
     Tidying           当前所有的任务以终止,ctl记录的任务数量为0
     Terminated     线程池彻底终止

46.线程池中 submit()和 execute()方法有什么区别?

     相同点: 都是开启线程执行池中的任务
     不同点: 接收的参数不一样
                  submit返回一个future,可以判断任务是否成功完成,实现Callable接口
                  execute没有返回值,可以执行任务,无法判断是否成功完成
                  submit方便Exception处理

47.在 java 程序中怎么保证多线程的运行安全?

     JDK Atomic开头的原子类,synchronized, LOCK,可以解决  原子性  问题
     synchronized,volatile,LOCK,可以解决  可见性  问题
     Happens-Before规则解决  有序性  问题

48.多线程锁的升级原理是什么?

     锁级别
            无锁 》 偏向锁 》 轻量级锁 》 重量级锁
     JVM优化synchronized的机制,当JVM检测到不同的竞争状态时,根据需要自动切换到合适的锁,
     这种切换就是锁的升级,升级是不可逆的,只能从低到高,不能降级

49.什么是死锁?

    死锁是指两个或两个以上的线程互相持有对方所需要的资源,
    会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁

50.怎么防止死锁?

.    死锁的四个必要条件:
             互斥条件 - 不剥夺条件 - 请求和保持条件 - 循环等待条件
     避免死锁的方式:
              加锁顺序 - 加锁时限 - 死锁检测

51.ThreadLocal 是什么?有哪些使用场景?

     ThreadLocal:线程局部变量,为每个线程创建一个变量,这个变量被附带在线程上,每个线程质检相互隔离互不干扰,该变   量副本只能创建它的线程使用
     
     应用场景:
           数据库连接  -  Session管理  -  多线程

52.说一下 synchronized 底层实现原理?

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

  • 普通同步方法,锁是当前实例对象

  • 静态同步方法,锁是当前类的class对象

  • 同步方法块,锁是括号里面的对象

53.synchronized 和 volatile 的区别是什么?

     作用:
            synchronized表示只有一个线程可以获取对象的锁,阻塞其它线程
            volatile表示变量在CPU寄存器中是不确定的,必须从主存中读取,保证多线程变量的可见性;禁止指令重排序
     区别:
            synchronized可以作用于变量,方法,对象;  volatile只能作用于变量
            synchronized可以保持线程问题的有序性,可见性,原子性; volatile只能保证可见性,有序性,无法保证原子性
            synchronized线程阻塞;  volatile线程不阻塞

54.synchronized 和 Lock 有什么区别?

     实现层面不同              synchronized是java关键字,JVM层面实现加锁和释放锁; Lock是一个接口,在代码层面实现加锁和释放锁
     是否自动释放锁           synchronized在线程代码执行完或出现异常时自动释放锁;  Lock不会自动释放锁,需要再finally()代码块中显示释放锁
     是否一直等待              synchronized会导致线程拿不到锁一直等待;  Lock可以设置尝试获取锁或者获取锁失败一定时间超时
     获取锁成功是否可见     synchronized无法得知是否获取成功; Lock可以通过tryLock获得加锁是否成功
     功能复杂性                 synchronized加锁可重入,不可中断,非公平; Lock可重入,可中断,可判断,可公平和不公平,细分读写锁提高效率

55.synchronized 和 ReentrantLock 区别是什么?

     实现层面不同              synchronized是java关键字,JVM层面实现加锁和释放锁; ReentrantLock是一个接口,在代码层面实现加锁和释放锁
     是否自动释放锁           synchronized在线程代码执行完或出现异常时自动释放锁;  ReentrantLock不会自动释放锁,需要再finally()代码块中显示释放锁
     是否一直等待              synchronized会导致线程拿不到锁一直等待;  ReentrantLock可以设置尝试获取锁或者获取锁失败一定时间超时
     获取锁成功是否可见     synchronized无法得知是否获取成功; ReentrantLock可以通过tryLock获得加锁是否成功
     功能复杂性                 synchronized加锁可重入,不可中断,非公平; ReentrantLock可重入,可中断,可判断,可公平和不公平,细分读写锁提高效率

56.说一下 atomic 的原理?

通过CAS乐观锁保证原子性,通过自旋保证当次修改的最终修改成功过,同通过降低锁粒度(多段锁)增加并发性能

发布了13 篇原创文章 · 获赞 1 · 访问量 1519

猜你喜欢

转载自blog.csdn.net/qq_42029989/article/details/104857350