多线程常见面试题(二)

1.线程之间的基本状态有哪些?以及状态与状态之间有什么关系?

答:新建,等待,就绪,运行,阻塞,死亡;

关系见下图:

2.如何能够保证线程安全

答:线程的安全主要是体现在下面三个方面

1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);

2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);

3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。

3.说明一下线程的同步和异步操作

答:假设为客服端与服务器端进行通信的情况下

同步:客户端必须等待服务器端的响应,在等待的期间客户端不能做其他的操作;

异步:客户端不需要等待服务器端的响应,在服务器处理请求的过程中,客户端可以进行其他的操作;

4.当一个线程进入一个对象的synchronized方法A之后,其他线程是否可以进入此对象的synchronized方法B

答:不能。其他线程只能访问该对象的非同步方法,同步方法是不能够进入的。因为同步方法上的synchronized修饰符要求执行方法时要获得对象的额锁;一个线程已经进入到A方法说明对象的锁已经被取走了,那么要进入B方法的线程就只能在等锁池中等待对象的锁。

5.同步方法和同步代码块的区别是什么?

答:1. 语法不同。 2. 同步块需要注明锁定对象,同步方法默认锁定this。 3. 在静态方法中,都是默认锁定类对象。 4. 在考虑性能方面,最好使用同步块来减少锁定范围提高并发效率;

6.Java中的多线程回调是什么意思?

答:所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。

7.请简要说明一下Java中Cyclicbarrier和Countdownlatch的区别分别是什么?

答:Cyclicbarrier和Countdownlatch都能够实现线程之间的等待,只不过他们的侧重点不同;

Countdownlatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;而Cyclicbarrier一般用于一组线程互相等待致某个状态,然后这一组线程再同时执行;另外Countdownlatch是不能够重用的,而Cyclicbarrier是可以重用的。

发布了42 篇原创文章 · 获赞 6 · 访问量 2952

猜你喜欢

转载自blog.csdn.net/qq_44666176/article/details/103343314