java多线程常见面试题
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同步代码块抛出异常会发生什么
无论是正常还是异常退出,里面线程都会释放锁