美文网首页
多线程面试

多线程面试

作者: 暑水 | 来源:发表于2019-08-11 10:19 被阅读0次

    地址一:https://blog.csdn.net/greensomnuss/article/details/54931315
    地址二:

    区别:

    一、volatile是变量修饰符,而synchronized则作用于一段代码或方法。

    二、volatile只是在线程内存和“主”内存间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源

    可重入锁:
    就是一个线程在获取了锁之后,再次去获取了同一个锁,这时候仅仅是把状态值进行累加。如果线程A释放了一次锁,就成这样了:

    • 仅仅是把状态值减了,只有线程A把此锁全部释放了,状态值减到0了,其他线程才有机会获取锁。当A把锁完全释放后,state恢复为0,然后会通知队列唤醒B线程节点,使B可以再次竞争锁。当然,如果B线程后面还有C线程,C线程继续休眠,除非B执行完了,通知了C线程。注意,当一个线程节点被唤醒然后取得了锁,对应节点会从队列中删除。
    • 非公平锁模型

    如果你已经明白了前面讲的公平锁模型,那么非公平锁模型也就非常容易理解了。当线程A执行完之后,要唤醒线程B是需要时间的,而且线程B醒来后还要再次竞争锁,所以如果在切换过程当中,来了一个线程C,那么线程C是有可能获取到锁的,如果C获取到了锁,B就只能继续乖乖休眠了。这里就不再画图说明了。

    Condition

    线程池:

    • 线程池的优点

    1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。

    2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。

    • 线程池的创建
    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  RejectedExecutionHandler handler)
    

    corePoolSize:线程池核心线程数量
    maximumPoolSize:线程池最大线程数量
    keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
    unit:存活时间的单位
    workQueue:存放任务的队列
    handler:超出线程范围和队列容量的任务的处理程序

    • 线程池的实现原理

    提交一个任务到线程池中,线程池的处理流程如下:

    1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。

    2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

    3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
    饱和策略:https://blog.csdn.net/hamimaj/article/details/84802811

    image.png

    相关文章

      网友评论

          本文标题:多线程面试

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