1.说一下线程池的四种创建方法
newCachedThreadPool newFixedThreadPool newSingleThreadExecutor newScheduledThreadPool
2.乐观锁和悲观锁的区别
就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。
乐观锁会遇到的问题
ABA 问题
如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 "ABA"问题。
JDK 1.5 以后的 AtomicStampedReference 类就提供了此种能力,其中的 compareAndSet 方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
3.TCP三次握手和四次挥手
不用多说。。
4.mysql innodb引擎的四种隔离级别
5.讲一下死锁
产生死锁的必要条件:
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。
预防 破坏”请求与保持"条件:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。 破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
避免 系统处于安全状态(存在能让所有进程执行完的序列),可避免死锁 系统处于不安全状态,可能进入死锁状态 (银行家算法)
检测 资源分配图不可完全简化,则是死锁状态
解除 处理抢占资源 / 终止死锁进程
6.讲述一下java的jvm模型
把新生代老年代永久代那一套讲给他,具体说了一下垃圾回收机制
7.说一下自旋锁和自适应自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。基于CAS实现
自适应自旋锁当时没听说过,,,直接说的没听说过
补充材料:
JVM对于自旋周期的选择,jdk1.5这个限度是一定的写死的,在1.6引入了适应性自旋锁,适应性自旋锁意味着自旋的时间不再是固定的了,而是由前一次在同一个锁上的自旋时间以及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行当中,那么虚拟机认为这次也有可能再次成功,进而允许它自旋时间更久一点,比如100个循环。相反,如果对于某个锁,自旋很少成功过 ,那么会忽略自旋过程直接进入阻塞,以免造成cpu浪费。
8.一个案例——用户下载了一个软件,说出我扫码登录这个过程到进入到这个界面可以正常使用的程序流程
用户点击登录会生成一个唯一性的二维码,用户手机端微信扫码登录,此时客户端等待用户的扫码情况(这里可以是循环等待也可以不等待,后期等后端发websocket),扫描后数据传递到后台服务器,服务器返回给客户端,完成登录。
9.如果你实习期间发现了一个地方洪水式袭击的请求,这种大量的请求已经构成破坏性攻击,怎么解决这个问题
10.说一下redis的底层
11.抽象类和接口的异同
|