`

复习大纲

阅读更多
https://maimai.cn/article/detail?fid=1082458242&efid=R-SdQ-TDbJmZWEdNokgwSw&from=singlemessage

1.Queue ThreadPoolExecutor的三种队列SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
https://www.cnblogs.com/feiyun126/p/7686302.html
每个队列底层实现的数据结构

2.Synchronized  类锁,对象锁

3.23种设计模式
https://www.cnblogs.com/geek6/p/3951677.html
https://blog.csdn.net/zhangerqing/article/details/8194653

4.集合
ArrayList http://www.cnblogs.com/skywang12345/p/3308556.html
LinkedList http://www.cnblogs.com/skywang12345/p/3308807.html
ArrayList的扩容原理,每次增加>>2一半,LinkedList的get原理,数据结构,遍历时使用哪种效率高。
Vector https://www.cnblogs.com/skywang12345/p/3308833.html Vector中的操作是线程安全的
Vector的扩容原理,增长系数,每次增加增长系数值,否则增加一倍。

5.海子多线程博客 https://www.cnblogs.com/dolphin0520/‘

6.Object方法 clone潜复制
clone,getClass,toString,finalize,equals,hashCode,wait,notify,notifyAll

7.单例模式在spring应用
每个类确实只产生一个bean实例,多个线程异步去可同时操作这个bean,正常会对其controller的成员变量产生线程不安全。
以上是正常思路,再说说除外的场景,https://wallimn.iteye.com/blog/2435341
大神详解 jdk动态代理和ThreadLocal应用使变量线程安全https://my.oschina.net/u/270991/blog/1785896?from=timeline
此问题可以延伸到Spring的实例化和自动装配工作https://blog.csdn.net/mack415858775/article/details/47721909

8.jdk动态代理
源码分析:http://www.cnblogs.com/zuidongfeng/p/8735241.html
传入代理类的类和接口和InvocationHandler对象(代理类关联对象),把接口转换为字节码文件
(代理类接口数量限制,是否存在缓存中,否则,使用ProxyClassFactory创建代理类),

ProxyClassFactory创建代理类,对文件进行校验(类型,重复),
真正生成新代理类的字节码文件(JDK动态代理就是通过程序来动态生成Class文件的。),
(第一步为代理类生成一个带参构造器,第二步, 生成静态域hashCode方法equals方法toString方法,
第三步, 生成代理方法,第四步, 生成静态初始化方法https://www.cnblogs.com/liuyun1995/p/8144706.html)
使用类加载器将代理类的字节码文件加载到JVM中。

执行时根据动态代理InvocationHandler参数回调到具体invoke方法,通过invoke执行代理类中的目标方法
Interceptor实现了InvocationHandler
invoke(代理对象,代理对象接口方法对象,参数数组),在invoke中执行代理类,前后加入自己方法。

9.Java原子类实现原理分析
从内存取出当前值a,定义新值(当前值a+1),把当前值再和内存值比较如果相等说明安全,原子化地更新去设定新值。
Java CAS ABA漏洞问题发生的场景分析:https://www.cnblogs.com/senlinyang/p/7875381.html
线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。比如:
  现有一个用单向链表实现的堆栈,栈顶为A,这时线程T1已经知道A.next为B,然后希望用CAS将栈顶替换为B:head.compareAndSet(A,B);在T1执行上面这条指令之前,线程T2介入,将A、B出栈,再pushD、C、A。而对象B此时处于游离状态:
此时轮到线程T1执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变为B,但实际上B.next为null,其中堆栈中只有B一个元素,C和D组成的链表不再存在于堆栈中,平白无故就把C、D丢掉了。
避免ABA可使用AtomicStampedReference

10.线上调查溢出,打印堆栈信息
jmap -heap 进程ID 打印堆空间占用
jmap -histo  进程ID 所有对象占用空间
jstat -gc 1024毫秒 50次 此机器堆栈占用信息
jstack是java虚拟机自带的一种堆栈跟踪工具

11.javaagent
javaagent应该更暴力些,跟这些修饰符没关系,直接修改字节码文件
javaagent就是更优雅一些,不用在代码中添加注解

12 @Scheduled quartz
一个东西,缺点是不只是高可用HA

13 lock和synchronized区别,reentrantlock和ReentrantReadWriteLock原理,每个方法的实现。

14 AbstractQueuedSynchronizer AQS原理
aqs一个抢占资源同步器框架,里面有队列,对队列等待,唤醒机制。一个线程获取资源,如果资源没有占用,返回成功获取资源,如果资源被占用,放到有序队列末尾,监听前一个节点,等待到前一节点释放状态变更(要求状态小于0,大于0是取消了抢占任务),此线程唤醒调整头节点再尝试获取资源。
http://www.cnblogs.com/waterystone/p/4920797.html

15 意向锁
行锁->表锁,表锁不需要再每一行去检查有没有行锁,直接有没有之前加过的意向锁,有了阻塞等待,没有加表锁。注意在第一步加行锁时,
是数据库自动完成申请一向锁,意向锁不需要我们自行添加
https://572327713.iteye.com/admin/blogs/2438247

16 cas原理:
cas三个参数 内存值V,旧的预期值A(当前方法最一开始取到的内存值),新值B,使用native方法当V与A比较,
如果相等,修改V变为B,如果不相等递归重复之前操作。
对ABA的问题隐患,场景分析
V和A比较时虽然是相等的,但V可能由其他线程操作过V变为N又变会V,导致不安全
场景是对于栈的指向问题会发生空指向,比如V的指向从空变为指向C,但是A不知道,又把V指向回了空。
https://www.cnblogs.com/senlinyang/p/7875381.html

17线程池
https://572327713.iteye.com/admin/blogs/2427908

18 Exception ,RunTimeException 异常, Error错误区别:
Error程序启动和运行时一般不会报错,会出现在服务器上,比如内存溢出。
RunTimeException 继承Exception,启动时编译器不会感知在运行时会报错,比如空指针,数组过界,运算错误。
Exception的非运行异常还有IO异常,线程interrupter异常,反射类无法找到,需要在代码里加try,catch才能编译通过。

19.浏览器缓存机制
https://www.cnblogs.com/shixiaomiao1122/p/7591556.html

20.volatil内存模型,为什么不能保证原子性,是如何保证视图性运行原理是?
https://www.jianshu.com/p/33bf19c072bd

21.深入理解java反射(运行时校验读取class文件信息的字段,方法,构造方法等)
https://572327713.iteye.com/blog/2440086

22.深入理解类加载机制和生命周期
https://572327713.iteye.com/blog/2440086

23.深入理解类加载器
https://572327713.iteye.com/blog/2440086

24.双亲委派模型
https://572327713.iteye.com/blog/2440086

25.深入理解spring boot加载工作原理
https://blog.csdn.net/htf2620032/article/details/79298661
https://www.cnblogs.com/shamo89/p/8184960.html
SpringBoot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器。

26.多路复用IO,epoll
单路阻塞:A一直等待B处理,此线程虽然挂起不占资源,但是一直傻傻的等。
多路复用:A还是B交给多路复用模型去处理,多路复用处理轮询去处理(select),或者按照节点信息(epoll)直接指针到位置去处理。
https://www.cnblogs.com/blfshiye/p/5411435.html

27.阻塞,同步
阻塞:在调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会被唤醒执行后续的操作,当前线程挂起(不占资源),但一直等待。
同步:必须一件事一件事的做,等前一件做完了,才能做下一件事,占用资源,没有通知。
非阻塞:在结果没有返回之前,该调用不会阻塞住当前线程。此线程先做其他事情,然后再不断扫结果,做到不阻塞。
异步:调用者在没有得到结果之前,可以继续执行后续操作,调用者等待结果通知就好。
https://baijiahao.baidu.com/s?id=1612594086537323804&wfr=spider&for=pc

28 AQS
aqs一个抢占资源同步器框架,里面有队列,对队列等待,唤醒机制。一个线程获取资源,如果资源被占用,放到有序队列末尾,监听前一个节点,当前节点释放状态变更,此线程唤醒调整头节点再尝试获取资源。
1,非公平和公平锁
抢占资源不成功分别什么处理流程
2,非公平锁自旋插入队尾,什么场景会不入队
3,说说可重入锁的实现
4,其中还有个状态大于0,等于 0,小于0分别含义,队列会状态如何处理
https://www.cnblogs.com/waterystone/p/4920797.html

29 rabbit

见分享文档
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics