2020年9月15日 线程通信问题(面试题)

1、为了解决“生产者与消费者问题”。

当一些线程负责往“数据缓冲区”放数据,另一个线程负责从“数据缓冲区”取数据。

问题1:生产者线程与消费者线程使用同一个数据缓冲区,就是共享数据,那么要考虑同步

问题2:当数据缓冲区满的时候,生产者线程需要wait(), 当消费者消费了数据后,需要notify或notifyAll

当数据缓冲区空的时候,消费者线程需要wait(), 当生产者生产了数据后,需要notify或notifyAll

2、java.lang.Object类中声明了:

(1)wait():必须由“同步锁”对象调用

(2)notfiy()和notifyAll():必须由“同步锁”对象调用

 

3、面试题:sleep()和wait的区别

(1)sleep()不释放锁,wait()释放锁

(2)sleep()在Thread类中声明的,wait()在Object类中声明

(3)sleep()是静态方法,是Thread.sleep()

wait()是非静态方法,必须由“同步锁”对象调用

(4)sleep()方法导致当前线程进入阻塞状态后,当时间到或interrupt()醒来

wait()方法导致当前线程进入阻塞状态后,由notify或notifyAll()

 

4、哪些操作会释放锁?

(1)同步代码块或同步方法正常执行完一次自动释放锁

(2)同步代码块或同步方法遇到return等提前结束

(3)wait()

 

5、不释放锁

(1)sleep()

(2)yield()

(3)suspend()

原文地址:https://www.cnblogs.com/douyunpeng/p/13674571.html