美文网首页
java多线程常见面试题

java多线程常见面试题

作者: 我爱吃水果c | 来源:发表于2018-04-03 16:49 被阅读0次

    1.java多线程有哪几种实现方式

        三种方式:

        1.继承Thread类实现多线成

        2.实现Runnable接口

        3.使用ExecutorService,Callable,Future实现有返回结果的多线程

    2.countdownlatch是什么,使用场景

        countdownlatch是一个同步工具类,它允许一个或者多个线程一直等待,知道其他线程执行完成之后再执行,适用于一组线程和另一个主线程之间的工作协作。一个主线程等待一组工作线程的任务完毕才继续它的执行。

    3.循环栅栏:CyclicBarrier

        可以堵住线程的执行,直到所有线程就绪;适用于一组线程需要在特定的事件上达成一致。它可以接收Runnable参数,被释放时执行。

    4.信号量Semaphore

        信号量有时也称为信号灯,是在多线程环境下使用的一种设施,负责协调各个线程,保证它们能够正确、合理的使用公共资源。通过acquier()和release()获取和释放许可。通过信号量我们还可以控制我们程序的被访问量,比如某一时刻,最多可以允许20个线程访问,超过了这个值其他线程就需要排队等待了。

    5.CountDowmLatch、CyclicBarrier、Semaphore比较

        CountDownLatch是能使一组线程都跑完了再跑;

        CyclicBarrier能够使一组线程在一个时间点上达到同步;可以一起开始执行全部任务或者一部分任务,同事它是可以循环使用的;

        Semaphore是只允许一定数量的线程同事执行一段任务

    6.Exchanger交换器

        Exchanger是用于线程间写作的工具类,Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个 同步点的两个线程可以交换彼此的数据

    7.java中的volatile变量是什么

        可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的

    8.什么是线程安全

        代码在多个线程中运行的时候,运行的结果和单线程是一样的

    9.线程发生异常的时候会怎么样

        1.异常被抛出,程序继续运行

        2.没有异常被捕获,该线程停止运行

    10.线程时间如何进行通讯

        1.共享变量

        2.wait,notify

        3.Lock,Condition机制

        4.管道机制

    11.为什么wait,notify和notifyAll这些方法不在thread类里面

        java提供的锁是对象级别的不是线程级别的,所以在object里面

    12.ThreadLocal变量,volatile变量,synchronized的区别

        volatile主要是用来在多线程中同步变量的

        ThreadLocal是线程的局部变量,就是一个Map

        synchronized关键字是java利用锁的机制自动实现的,一般有同步方法和同步代码块

    13.什么是Future,FutureTask

        Future就是对具体的Runnable或者C啊拉拉巴勒任务执行结果进行取消,查询是否完成,得到执行结果

        FutureTask实现了RunableFuture接口,表示是可以取消的异步运算,可以交给Executor来执行

    14.如何避免死锁

        互斥条件:一个戏院每次只能被一个线程使用

        请求与保持条件:一个线程的请求资源阻塞时候,对已获得资源保持不放

        不剥夺条件:线程已获得的资源在未使用完之前不能强行剥夺

        循环等待条件:若干个线程之间形成一种头尾想接的等待资源的关系

    15.怎么检测一个线程是否拥有锁

        用holdsLock()方法

    16.ReentrantLock锁

        是concurrent包下面的一套互斥锁,添加了一些高级功能

        1.等待可中断,正在等待资源的线程可以选择放弃

        2.公平锁,多个线程等待资源的时候,必须按照申请的时间顺序获得锁

        3.锁绑定多个条件,可以同事绑定对象

    17.如何确保T1,T2,T3的执行顺序

        可以使用线程类的join()方法,在一个线程中启动另外一个线程,应该钱启动最后一个(T3调用T2,T2调用T1),这样T1就可以先于T3完成

    18.多线程中的忙循环是什么

        忙循环就是程序员让一个线程循环等待,就是一个空循环,目的是为了保留cpu的缓存,在多核的情况下,一个线程醒来的时候可能在另外一个核里面运行。为了逼毛重建缓存和减少等待时间就可以使用它

    19同步代码块抛出异常会发生什么

        无论是正常还是异常退出,里面线程都会释放锁

    相关文章

      网友评论

          本文标题:java多线程常见面试题

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