1.线程的等待和通知机制如何实现
等待通知机制,是指一个线程A调用了对象O的wait方法进入等待状态,而另一个线程调用了对象O的notify或者notifyAll方法,线程A收到通知后从对象O的wait方法返回,进而执行后续操作
锁对象:
- 同步方法
- 静态方法 : 类.class
- 实例方法: this
同步代码块
写在synchronized括号中的对象
可以通过锁对象调用Object类的方法:
- wait() 让当前线程等待,直到被通知
- wait(long) 让线程等待,直到被通知或时间结束
- notify() 随机唤醒一个线程
- notifyAll() 唤醒所有线程
注意:如果不是锁对象调用上面的方法会出现异常IllegalMonitorStateException
2.什么是生产者消费者模式,解决了什么问题,实现的思路是什么?
是一种设计模式,用于解决两个点(线程、进程、服务器)之间数据通信的协调问题。
生产数据的点叫生产者,使用数据的点叫消费者,生产者和消费者可能存在速度不一致的情况。生产者速度过快,消费者消费速度慢,会浪费大量资源;反过来,消费者速度快,生产者速度慢,消费者浪费时间取等待。
3.阻塞队列是什么,有什么作用?
是一种特殊的集合,会自动阻塞对队列添加或删除数据的线程,也可以自动通知
BlockingQueue接口
put(T) 添加数据到队尾,到临界值阻塞
T take 从队头取出并删除数据,到空时阻塞
常用实现类:
ArrayBlockingQueue 数组结构的阻塞队列
LinkedBlockingQueue 链表结构的阻塞队列
SynchronousQueue 同步机制的队列
4.ThreadLocal是什么,有什么作用?
线程局部变量,也是解决线程同步问题的一种方式
锁机制 多个线程排队访问一个资源 以时间换空间
ThreadLocal 多个线程并发访问自己独立的资源 以空间换时间
5.讲讲强软弱虚引用
强引用: 一般情况下创建的对象
Person person = new Person()
如果对象有引用指向,就不会被垃圾收集,没有引用指向就可能被垃圾收集
person = null;
软引用: SoftReference
如果即将出现OOM,gc会优先回收软引用,比强引用更容易被回收
主要用于缓存
弱引用:WeakReference
只要出现gc,都会进行回收
可以缓存临时数据
虚引用: PhantomReference
形同虚设,不能作为对象的引用使用,主要用于跟踪垃圾收集器的活动
强引用 > 软引用 > 弱引用 > 虚引用