程序猿阵线联盟-汇总各类技术干货程序员多线程

Java多线程的问题及答案

2019-02-06  本文已影响4人  Real_man

收集常见的问题,以后或许用得到

  1. 线程池的原理,为什么要创建线程池?创建线程池的方式?
    答:当向线程池提交一个任务的时候。

在实际的生产环境中,线程的数量必须得到控制,盲目的大量创建线程对系统性能是有伤害的,合理使用线程好处:

创建线程池的方式:

参考:多线程之线程池(六)

  1. 线程的生命周期,什么时候会出现僵死进程?
    线程是轻量级的进程,进程可以说是线程的容器。


    image

参考:多线程之并发基础-线程状态与操作(三)

  1. 说说线程安全问题,什么是实现线程安全,如何实现线程安全?
    并发编程中最常出现的情形就是多个线程共享一个资源,这些共享的资源很可能导致错误或者数据不一致的情形,需要想办法来解决这种问题。线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。

线程安全实现方式:

参考:Java高效并发(九)

  1. synchronized即可修饰非静态方式,也可修饰静态方法,还可修饰代码块,有何区别?
    答:synchronized修饰非静态同步方法时,锁住的是当前实例;synchronized修饰静态同步方法时,锁住的是该类的Class对象;synchronized修饰静态代码块时,锁住的是synchronized关键字后面括号内的对象。
  1. 创建线程池有哪几个核心参数? 如何合理配置线程池的大小?

线程池中线程的数量过大和过小都无法使系统的性能发挥到最优,确定线程池的大小可以考虑下面的角度:

参考:多线程之线程池(六)

  1. volatile、ThreadLocal的使用场景和原理?
    JMM中主要是围绕并发过程中如何处理原子性,可见性和有序性三个特性来建立的。最终可以保证线程安全性.

一个变量定义为volatile之后,它将具有两种特性:

Synchronized保证了原子性,可见性与有序性,它的工作时对同步的代码块加锁,使得每次只有一个线程进入代码块,从而保证线程安全。synchronized反应到字节码层面就是monitorenter与monitorexit.

Volatile适合做什么?
适合做标量,当一个线程对某个变量进行读写操作,而其它线程仅仅进行读操作的时候,是可以保证volatile的正确性的。如下:

volatile bool stopped;
public void stop(){
    stopped = true
}

while(!stoppped){
    // 执行操作
}

参考:多线程之volatile与synchronized(二)

  1. ThreadLocal什么时候会出现OOM的情况?为什么?
    答:当一个线程调用ThreadLocal的set方法设置变量时候,当前线程的ThreadLocalMap里面就会存放一个记录,这个记录的key为ThreadLocal的引用,value则为设置的值。如果当前线程一直存在而没有调用ThreadLocal的remove方法,并且这时候其它地方还是有对ThreadLocal的引用,则当前线程的ThreadLocalMap变量里面会存在ThreadLocal变量的引用和value对象的引用是不会被释放的,这就会造成内存泄露的。

参考:使用ThreadLocal不当可能会导致内存泄露
借ThreadLocal出现OOM内存溢出问题再谈弱引用WeakReference

最后

持续更新,多线程相关问题

题目参考

上一篇下一篇

猜你喜欢

热点阅读