一、Object类里面的方法有哪些
①hashcode方法
②equals方法
③wait方法
④notify方法
⑤notifyAll方法
⑥clone方法
⑦toString方法
⑧finalize方法
⑨getClass方法
二、hashcode()和equals()的作用
从hashMap入手,哈希码的值和哈希冲突,equals的对象比较等。
三、面向对象的特性
封装、继承、多态的三大特性。高内聚,低耦合。
四、四种引用
强引用,软引用,弱引用、虚引用
五、普通内部类和静态内部类的区别
①静态内部类相对与外部类是独立存在的,普通内部类作为外部类一个成员而存在。
②静态内部类中无法直接访问外部类中的变量、方法。如果要访问的话,必须要new一个外部类的对象,普通内部类中可以直接访问外部类属性,调用外部类的方法。
六、虚拟机JVM的内存模型结构
线程私有的虚拟机栈、程序计数器、本地方法栈。线程公有的方法区、堆区。然后就是JVM的堆区的分代思想。
七、双亲委派机制
启动类加载器—>扩展类加载器—>应用类加载器。保护核心API。
八、synchronized的原理
对象头的Mark Word记录着32bit信息(哈希码、分代年龄、偏向锁等记录),线程第一次占有的时候,栈空间有一个Lock Recod会用CAS交换对象头数据。当有线程来抢占的时候就会关联到Minitor(含有WaitSet/EntryList/Owner),此时就会加入到队列中。如下图所示。synchronized(xxx.Class){}
九、ReentrantLock的原理
①ReentrantLock是实现了接口Lock,基于AQS同步器的实现。
②ReentrantLock有公平锁FairSync和非公平锁NonFairSync,默认非公平锁。
③公平锁的实现就是谁等待时间最长,谁就先获取锁
④非公平锁就是随机获取的过程,谁运气好,cpu时间片轮询到哪个线程,哪个线程就能获取锁
⑤CAS操作抢占锁,抢占成功则修改锁的状态为1,将线程信息记录到锁当中,返回state=1。
⑥抢占不成功,tryAcquire获取锁资源,获取成功直接返回,获取不成功,新建一个检点插入到当前AQS队列的尾部,acquireQueued(node)表示唤醒AQS队列中的节点再次去获取锁。
⑦非公平锁维护一个state值,当为0的时候表示无锁,否则就是有锁,将其它线程放入队列中,当前面持有锁的对象释放后,后面的等待线程可以抢占锁。
十、常见的同步器和线程池
同步器:
①同步器有CountDownLatch、Semaphore、CyclicBarrier
②CountDownLatch维护一个state值可以大于1,若维护的值为n,每次线程释放都会调用countDown()方法将state值减一,减法计数器,当state减到0后又重新放入n个线程。
③CyclicBarrier和CountDownLatch相似。CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
④Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量。Semaphore的基本使用场景是限制一定数量的线程能够去执行。举例说明:张三、李四和王五和赵六4个人一起去饭店吃饭,不过在特殊时期洗手很重要,饭前洗手也是必须的,可是饭店只有2个洗手池,洗手池就是不能被同时使用的公共资源,这种场景就可以用到Semaphore。当已经有两个人在洗手的时候,其他人就被阻塞,直到有人洗手完毕才是开始洗手。
线程池:
①降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
②提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
③提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
④线程常见的构造器和参数理解如下所示
//corePoolSize 核心线程数目 (最多保留的线程数)
//maximumPoolSize 最大线程数目
//keepAliveTime 生存时间 - 针对救急线程
//unit 时间单位 - 针对救急线程
//workQueue 阻塞队列
//threadFactory 线程工厂 - 可以为线程创建时起个好名字
//handler 拒绝策略
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)