Java各类技能知识点学习链接大全

以下内容均为其它网站学习链接,收藏以便随时复习翻阅,同时分享给大家(如有不妥,可随时联系本人删除,感谢!)

 

一、Java基础

1、Java使用Lombok的优缺点:

https://hollis.blog.csdn.net/article/details/104259307

2、Java String类为什么是final的?

https://www.jianshu.com/p/9c7f5daac283

3、jdk8动态代理源码:

https://www.jianshu.com/p/269afd0a52e6

4、五种IO模式

https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41&scene=21#wechat_redirect

5、Java NIO 浅析(美团技术博客)

https://zhuanlan.zhihu.com/p/23488863

6、Java ConcurrentModificationException异常原因和解决方法

https://www.cnblogs.com/dolphin0520/p/3933551.html

(1)、这个快速失败的意思是无论当前是否有并发的情况或问题,只要发现了修改读取不一致就抛异常;

       如果是ArrayList遍历读取时不加锁,这时其他线程修改了ArrayList(增加或删除),

       会抛出ConcurrentModificationException,这就是failfast机制, 通过fastfail来保证集合的正确性;

     (我们这里只讨论Iterator遍历,如果是普通for循环可能会数组越界)

(2)、 多线程解决方案:  

CopyOnWriteArrayList 调用iterator时生成的是一个新的数组快照,遍历时读取的是快照,所以永远不会报错(即使读取后修改了列表),并且在CopyOnWriteArrayList是没有fastfail机制的,原因就在于Iterator的快照实现以及CopyOnWrite已经不需要通过fastfail来保证集合的正确性

CopyOnWriteArrayList的CopyOnWrite即修改数组集合时,会重新创建一个数组并对新数据进行调整,调整完成后将新的数组赋值给老的数组

7、Java中StringBuffer的缓冲区为什么是16?

https://www.zhihu.com/question/283546127

8、WeakHashMap工作原理

https://www.haoid.cn/post/13124

9、ThreadLocal详解,和使用可能出现的问题

https://cloud.tencent.com/developer/article/1558777

https://zhuanlan.zhihu.com/p/34494674

https://www.jianshu.com/p/3bb70ae81828

https://zhuanlan.zhihu.com/p/102571059

10、

https://www.cnblogs.com/qf123/p/8483744.html

(如果要实现TreeSet 或者TreeMap的 排序(或者说让一个TreeSet可用),必须让加入的对象具有可排序性,否则就会报错 java.lang.ClassCastException。)

11、图解LinkedHashMap原理

https://www.jianshu.com/p/8f4f58b4b8ab

12、序列化和反序列化(美团技术博客)

https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html

13、Java 8系列之重新认识HashMap(美团技术博客)

https://tech.meituan.com/2016/06/24/java-hashmap.html

14、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

https://www.cnblogs.com/williamjie/p/11164283.html

15、面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》

https://www.cnblogs.com/xiaofuge/p/13587826.html

16、String,StringBuilder,StringBuffer 实现原理解析

 (StringBuffer内部用synchronized关键字控制线程安全,在toString()方法中讲字符串缓存到toStringCache提高访问性能)

https://www.jianshu.com/p/64519f1b1137

17、Comparable与Comparator的区别

https://blog.csdn.net/mageshuai/article/details/3849143

18、Java中Native关键字的作用

https://www.cnblogs.com/KingIceMou/p/7239668.html

使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。
这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

JAVA本地方法适用的情况 
(1)为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问

(2)为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的

(3)为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

19、寻找Java中String.split性能更好的方法

(跟StringUtils.split 对比)

https://segmentfault.com/a/1190000016901608

20、JDK11变化详解,JDK8升级JDK11详细指南

https://www.jianshu.com/p/81b65eded96c

21、Java8新特性(一)_interface中的static方法和default方法

https://www.cnblogs.com/zhenghengbin/p/9398682.html

22、jdk8新语法Lambda表达式用处

https://www.zhihu.com/question/20125256 (Mingqi回答)

23、jdk8新特性

https://blog.csdn.net/qq_29411737/article/details/80835658

24、java 8的java.time包(非常值得推荐)

用过java1.8之前原生的日期处理api,你就会知道用起来非常麻烦,而且要注意的地方有点多

     (例如月份是由0开始,而且api使用有的不统一,线程不安全等等...),

     所以在java1.8之前的日期api都不值得去使用,虽然说现在都有强大的日期处理的第三方库,

     但是会有兼容性问题,那么现在jdk8有了新的时间处理类,为何不去尝试一下

https://www.jianshu.com/p/19bd58b30660

25、LinkedHashMap 源码详细分析(JDK1.8)以及简单的LRU算法实现

https://www.imooc.com/article/22931

26、为什么 String hashCode 方法选择数字31作为乘子

https://www.imooc.com/article/30297

27、HashMap的负载因子为什么是0.75

https://segmentfault.com/a/1190000023308658

28、深入理解java异常处理机制

https://guisu.blog.csdn.net/article/details/6155636

结论:

(1)、finally覆盖catch(开头引子的例子):

      a)如果finally有return会覆盖catch里的throw,同样如果finally里有throw会覆盖catch里的return。

      b) 如果catch里和finally都有return, finally中的return会覆盖catch中的。throw也是如此。

(2)、catch有return而finally没有:

     当 try 中抛出异常且catch 中有 return 语句,finally 中没有 return 语句, java 先执行 catch 中非 return 语句,再执行 finally 语句,最后执行 catch 中 return 语句。

(3)、try有return语句,后续还有return语句,分为以下三种情况:

    情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

    情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

    情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:

        a)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

        b)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

 

二、Java并发

1、【JUC】JUC锁框架综述

https://www.cnblogs.com/leesf456/p/5344133.html

2、深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析(上)

https://www.infoq.cn/article/jdk1.8-abstractqueuedsynchronizer

深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析(下)

https://www.infoq.cn/article/java8-abstractqueuedsynchronizer

(视频: https://www.bilibili.com/video/BV19J411Q7R5?from=search&seid=16826376073989528175 

https://www.bilibili.com/video/BV1cK411M7d4?p=1 

   https://www.bilibili.com/video/BV1yJ411v7er?p=1 )

3、ConcurrentHashMap源码(1.7和1.8)

https://www.jianshu.com/p/865c813f2726

https://blog.csdn.net/u010723709/article/details/48007881

4、Condition.await, signal 与 Object.wait, notify 的区别

https://my.oschina.net/u/174366/blog/608509

https://blog.csdn.net/sophia__yu/article/details/84502578

5、sleep() 和 wait() 的区别

https://blog.csdn.net/xyh269/article/details/52613507

6、Doug Lea在J.U.C包里面写的BUG又被网友发现了

https://www.cnblogs.com/thisiswhy/p/13791966.html

7、why技术博客(推荐阅读)

https://www.cnblogs.com/thisiswhy/

8、LockSupport的用法及原理

  • park和unpark可以实现类似wait和notify的功能,但是并不和wait和notify交叉,也就是说unpark不会对wait起作用,notify也不会对park起作用。
  • LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦
  • park和unpark的使用不会出现死锁的情况
  • blocker的作用是在dump线程的时候看到阻塞对象的信息

https://www.jianshu.com/p/f1f2cd289205

9、自己动手写把”锁”---LockSupport深入浅出

https://www.cnblogs.com/qingquanzi/p/8228422.html

10、不可不说的Java“锁”事

https://tech.meituan.com/2018/11/15/java-lock.html

11、为什么需要可重入锁?

就是一个方法里,外层方法占用了锁,但是里面还有方法要获得锁,如果不是重入锁,程序无法继续运行,陷入死锁,是重入锁就可以继续执行。

12、线程池实现原理(美团技术博客):

https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

(同一篇博客其它地址:https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651751537&idx=1&sn=c50a434302cc06797828782970da190e&chksm=bd125d3c8a65d42aaf58999c89b6a4749f092441335f3c96067d2d361b9af69ad4ff1b73504c&scene=21#wechat_redirect)

源码分析: https://www.cnblogs.com/wangshen31/p/10556201.html

13、从ReentrantLock的实现看AQS的原理及应用:(美团技术博客)

https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html

14、Java内存访问重排序的研究 (美团技术博客)

https://tech.meituan.com/2014/09/23/java-memory-reordering.html

15、分布式队列编程优化篇 (美团技术博客)

https://tech.meituan.com/2016/08/05/distributed-queue-based-programming-optimization.html

16、【Java 线程池】Java 创建线程池的正确姿势: Executors 和 ThreadPoolExecutor 详解:

(避免使用无界阻塞队列,并且使用guava包给线程池命名,方便排查问题)

https://cloud.tencent.com/developer/article/1638175

17、并发容器-ConcurrentLinkedQueue详解

https://www.jianshu.com/p/231caf90f30b

18、线程池submit和execute方法有什么区别

https://www.cnblogs.com/jxxblogs/p/11882381.html

19、一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

20、线程的状态:

https://www.cnblogs.com/albertrui/p/8391447.html

21、为什么start方法会调用run方法?(为什么不能直接run来实现创建线程?)

https://blog.csdn.net/qq_42859864/article/details/103428493

22、sleep() 和 wait() 的区别

https://www.jianshu.com/p/87a7f24c45d4

https://blog.csdn.net/xyh269/article/details/52613507

23、Thread中stop(),suspend(),resume()为什么不安全

https://www.jianshu.com/p/7a123f212ca1

24、java 为什么wait(),notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用?

假设没有应用Synchronized关键字,当消费者线程执行wait操作的同时,生产线线程执行notify,生产者线程可能在等待队列中找不到消费者线程。导致消费者线程一直处于阻塞状态。那么这个模型就要失败了。所以必须要加Synchronized关键字。 点睛之笔

https://blog.csdn.net/lengxiao1993/article/details/52296220

25、线程池中submit() 和 execute()方法有什么区别?

https://my.oschina.net/boonya/blog/3072147

https://www.jianshu.com/p/29610984f1dd

26、java面试题之java中用到的线程调度算法是什么

https://www.cnblogs.com/hujinshui/p/10212182.html

27、Java多线程循环打印ABC的5种实现方法

https://blog.csdn.net/weixin_39723337/article/details/80352783

28、深入理解Java线程池:ScheduledThreadPoolExecutor

https://www.jianshu.com/p/925dba9f5969

29、如何用LinkedHashmap实现LRU:

https://blog.csdn.net/exceptional_derek/article/details/11713255

30、面试官让我实现一个线程安全并且可以设置过期时间的LRU缓存(如果不用LinkedHashmap)

https://zhuanlan.zhihu.com/p/135936339

31、wait为什么要在同步块中使用? 为什么sleep就不用再同步块中?

假设没有应用Synchronized关键字,当消费者线程执行wait操作的同时,生产线线程执行notify,生产者线程可能在等待队列中找不到消费者线程。导致消费者线程一直处于阻塞状态。那么这个模型就要失败了。所以必须要加Synchronized关键字。 

https://www.cnblogs.com/myseries/p/13903051.html

32、Java--偏向锁/轻量级锁/重量级锁

https://blog.csdn.net/qq_32924343/article/details/79680681

33、深入理解Java并发之synchronized实现原理

https://blog.csdn.net/javazejian/article/details/72828483

34、锁的等级:方法锁、对象锁、类锁

https://www.jianshu.com/p/92b75042c059

35、怎么检测一个线程是否拥有锁 :java Thread  holdsLock()方法检测一个线程是否拥有锁

https://blog.csdn.net/w410589502/article/details/54949506

36、Executors类是什么? Executor和Executors的区别

https://blog.csdn.net/xiaojin21cen/article/details/87183308

 

三、JVM相关

1、使用 VisualVM 进行性能分析及调优

https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

2、JDK8中JVM堆内存划分

https://www.cnblogs.com/jtlgb/p/10276258.html

3、Jvm调优系列
https://www.cnblogs.com/andy-zhou/p/5327288.html

4、如何在CMS和G1之间选择垃圾回收器:

https://zhuanlan.zhihu.com/p/59861022

5、堆中年轻代、老年代区分

https://www.cnblogs.com/crazy-lc/p/12636927.html

6、阿里JVM专家——  寒泉子博客

http://lovestblog.cn/

https://yq.aliyun.com/users/twvy4bo6n4ey2

7、Java中的NIO为什么用直接内存,而不用堆heap内存

https://cloud.tencent.com/developer/article/1586341

https://www.cnblogs.com/stevenczp/p/7506280.html

https://www.cnblogs.com/yanl55555/p/13334667.html

8、Java中9种常见的CMS GC问题分析与解决 (美团技术博客)

https://tech.meituan.com/2020/11/12/java-9-cms-gc.html

9、Jvm 启动常见参数 :

https://blog.csdn.net/kthq/article/details/8618052

10、从实际案例聊聊Java应用的GC优化(美团技术博客)

https://tech.meituan.com/2017/12/29/jvm-optimize.html

11、JVM系列详解:

(1)Java虚拟机详解(一)------简介

https://www.cnblogs.com/ysocean/p/9345787.html

(2)Java虚拟机详解(二)------运行时内存结构

https://www.cnblogs.com/ysocean/p/9345622.html

(3)Java虚拟机详解(三)------垃圾回收

https://www.cnblogs.com/ysocean/p/11108933.html

(4)Java虚拟机详解(四)------垃圾收集器

https://www.cnblogs.com/ysocean/p/11117365.html

(5)Java虚拟机详解(五)------JVM参数(持续更新)

https://www.cnblogs.com/ysocean/p/11109018.html

(6)Java虚拟机详解(六)------内存分配

https://www.cnblogs.com/ysocean/p/11117359.html

(7)Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

https://www.cnblogs.com/ysocean/p/11311667.html

(8)Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化

https://www.cnblogs.com/ysocean/p/11415514.html

 

12、Java8内存模型—永久代(PermGen)和元空间(Metaspace)

https://www.cnblogs.com/paddix/p/5309550.html

https://www.jianshu.com/p/92a5fbb33764

https://www.jianshu.com/p/a6f19189ec62

https://www.jianshu.com/p/1a0b4bf8d498

13、深入理解垃圾收集器和收集器的选择策略

https://blog.csdn.net/killuazoldyck/article/details/75081875

(对于吞吐量优先的场景,就只有一种选择,就是使用 PS 组合(Parallel Scavenge+Parallel Old )。
对于响应时间优先的场景,在 JDK1.8 的话优先 G1,其次是 CMS 垃圾回收器,另外还有PN、ZGC、Shenandoah。)

14、jvm垃圾回收器(串行、吞吐量优先、响应时间优先、G1)

https://www.cnblogs.com/zhai1997/p/12925364.html

15、JVM的永久代中会发生垃圾回收吗? 参考《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

有些人认为方法区(如HotSpot虚拟机中的元空间或者永久代)是没有垃圾收集行为的,《Java虚
拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整
实现方法区类型卸载的收集器存在(如JDK 11时期的ZGC收集器就不支持类卸载),方法区垃圾收集
的“性价比”通常也是比较低的:在Java堆中,尤其是在新生代中,对常规应用进行一次垃圾收集通常
可以回收70%至99%的内存空间,相比之下,方法区回收囿于苛刻的判定条件,其区域垃圾收集的回
收成果往往远低于此。
方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类型。回收废弃常量与回收
Java堆中的对象非常类似。举个常量池中字面量回收的例子,假如一个字符串“java”曾经进入常量池
中,但是当前系统又没有任何一个字符串对象的值是“java”,换句话说,已经没有任何字符串对象引用
常量池中的“java”常量,且虚拟机中也没有其他地方引用这个字面量。如果在这时发生内存回收,而且
垃圾收集器判断确有必要的话,这个“java”常量就将会被系统清理出常量池。常量池中其他类(接
口)、方法、字段的符号引用也与此类似。
判定一个常量是否“废弃”还是相对简单,而要判定一个类型是否属于“不再被使用的类”的条件就
比较苛刻了。需要同时满足下面三个条件:
·该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。
·加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如
OSGi、JSP的重加载等,否则通常是很难达成的。
·该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方
法。
Java虚拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是
和对象一样,没有引用了就必然会回收。关于是否要对类型进行回收,HotSpot虚拟机提供了Xnoclassgc参数进行控制,
还可以使用-verbose:class以及-XX:+TraceClass-Loading、-XX:
+TraceClassUnLoading查看类加载和卸载信息,其中-verbose:class和-XX:+TraceClassLoading可以在
Product版的虚拟机中使用,-XX:+TraceClassUnLoading参数需要FastDebug版[1]的虚拟机支持。
在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载
器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压
力。
 

16、JVM监控命令:jps jstat jmap jhat jstack jinfo,可视化监控工具:jvisualvm、jconsole介绍:

https://www.cnblogs.com/ityouknow/p/5714703.html

https://segmentfault.com/a/1190000021547646

17、新一代垃圾回收器ZGC的探索与实践(基于JDK版本11)

https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651752559&idx=1&sn=c720b67e93db1885d72dab8799bba78c&chksm=bd1251228a65d834db610deb2ce55003e0fc1f90793e84873096db19027936f6add301242545&scene=21#wechat_redirect

18、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

https://blog.csdn.net/gaoyong_stone/article/details/79540242

 

四、数据库相关

1、MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

https://www.cnblogs.com/jpfss/p/8890250.html

2、一张图彻底搞懂MySQL的 explain

https://segmentfault.com/a/1190000021458117

3、select for update使用详解

https://zhuanlan.zhihu.com/p/143866444

4、mysql for update 死锁问题:

https://www.jianshu.com/p/2b258bfe00e5

我们已经知道,这种情况出现的原因是:两个session同时通过select for update,并且未命中任何记录的情况下,是有可能得到相同gap的锁的(要看where筛选条件是否落在同一个区间。如果上面的案例如果一个session准备插入'6'另一个准备插入'11'

           (上面文章没有这个值,假设表里面有 id =12的值,插入11,就在10~12直接有一个gap锁,不会跟6的gap锁产生冲突                   了)则不会出现冲突,因为不是同一个gap)。

 此时再进行并发插入,其中一个会进入锁等待,待第二个session进行插入时,会出现死锁。MySQL会根据事务权重选择一个事务进行回滚。

那么如何避免这个情况呢?
一种解决办法是将事务隔离级别降低到Read Committed,这时不会有gap锁,对于上述场景,如果where中条件不同即最终要插入的键不同,则不会有问题。如果业务代码中可能不同线程会尝试对相同键进行select for update,则可在业务代码中捕获索引冲突异常进行重试。
此外,上面代码示例中的代码还有一处值得注意的地方是事务注解@Transactional的传播机制,对于这类与主流程事务关系不大的方法,应当将事务传播行为改为REQUIRES_NEW。
原因有两点:

因为这里的解决方案是对隔离级别降级,如果传播行为仍然是默认的话,在外层事务隔离级别不是RC的情况下,会抛出IllegalTransactionStateException异常(在你的TransactionManager开启了validateExistingTransaction校验的情况下)。
如果加入外层事务的话,某个线程在执行获取流水号的时候可能会因为另一个线程的与流水号不相关的事务代码还没执行完毕而阻塞。

5、MySQL的四种事务隔离级别

https://www.cnblogs.com/huanongying/p/7021555.html

6、查询使用limit的优化:在MySQL中如何使用覆盖索引优化limit分页查询

https://www.jianshu.com/p/c6290e65d8b5

7、MySQL索引背后的数据结构及算法原理

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

8、Innodb中的事务隔离级别和锁的关系(美团技术博客)

https://tech.meituan.com/2014/08/20/innodb-lock.html

9、MySQL索引原理及慢查询优化(美团技术博客)

https://tech.meituan.com/2014/06/30/mysql-index.html

10、MyBatis 如何实现流式查询

https://segmentfault.com/a/1190000022478915

 

五、Sping、Mybatis系列

1、Spring事务Transactional和动态代理(三)-事务失效的场景

https://www.cnblogs.com/qizhelongdeyang/p/12418386.html

2、springIoc:

https://www.zhihu.com/question/23277575/answer/853179950

3、Spring AOP——Spring 中面向切面编程

https://www.cnblogs.com/joy99/p/10941543.html

4、聊聊MyBatis缓存机制(美团技术博客)

https://tech.meituan.com/2018/01/19/mybatis-cache.html

 

六、SpringCloud全家桶

1、springCloud面试题大全:

https://juejin.im/post/6844904125717544973(链接中还要其它全面的面试题)

2、Spring Cloud Netflix项目进入维护模式

https://www.cnblogs.com/doit8791/p/10206867.html

3、springcloud入门系列(8)分布式服务跟踪sleuth+zipkin

https://www.jianshu.com/p/6ef0b76b9c26

 

七、Linux

1、awk+uniq+sort 统计字符串出现次数并排序

https://www.jianshu.com/p/7f2a6575839e

https://my.oschina.net/yuanshic/blog/1620488

2、Linux 下清空或删除大文件内容的 5 种方法

# > access.log

# echo "" > access.log

https://linux.cn/article-8024-1.html

 

 

八、Redis 缓存

1、Redis命令参考大全

http://doc.redisfans.com/index.html

2、Redis分布式锁的实现原理

https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247483893&idx=1&sn=32e7051116ab60e41f72e6c6e29876d9&chksm=fba6e9f6ccd160e0c9fa2ce4ea1051891482a95b1483a63d89d71b15b33afcdc1f2bec17c03c&scene=21#wechat_redirect

3、每秒上千订单场景下的分布式锁高并发优化实践!【石杉的架构笔记】

https://mp.weixin.qq.com/s/RLeujAj5rwZGNYMD0uLbrg

4、聊聊高并发系统之限流特技

https://www.iteye.com/blog/jinnianshilongnian-2305117

5、限流:Redis + lua分布式限流

http://www.mamicode.com/info-detail-2307970.html

https://mp.weixin.qq.com/s/kyFAWH3mVNJvurQDt4vchA

https://www.iteye.com/blog/jinnianshilongnian-2305117(张开涛)

(限流的几种做法,

a、ngnix在网关层限流   https://juejin.im/post/6844904065306984461

ngx_http_limit_req_module 

http { limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s; }

  • zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
  • rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

b、Google 的 Guava RateLimiter限流: https://www.jianshu.com/p/5d4fe4b2a726

c、ngnix+lua分布式全局限流 :https://www.cnblogs.com/lay2017/p/9074477.html

6、布隆过滤器原理:

https://www.jianshu.com/p/2104d11ee0a2

  (布隆过滤器应用场景:          

        (1)、在缓存穿透问题上,使用布隆过滤器判断数据是否存在,不存在直接返回
        在缓存之前在加一层 BloomFilter ,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。

Java各类技能知识点学习链接大全_第1张图片
        (2)、海量数据去重:爬虫系统中对成千上万的url的去重等
        (3)、邮箱系统的垃圾邮件过滤功能
        (4)、黑名单过滤功能
        (5)、判断一个数字是否在包含大量数字的数字集中

  )

7、接口幂等性

https://zhuanlan.zhihu.com/p/56143768?utm_source=wechat_timeline

例:

A应用,发过来两个请求到B应用,请求扣款,都是同样的一个单号123,

B应用,需要针对 t_account 账户表,帐号abc去扣款,t_account表 怎么去识别这个流水号是否已经扣过款了呢?

需要先去 t_trans_detail 交易记录表,查询一下,有没有这条扣款流水记录,状态status是支付成功的;


(1)、第一次支付成功后之后,t_trans_detail流水表,订单状态status更改为PAYED(已支付),并记录支付流水号123;

(2)、其它请求,发起对该订单的发货请求deliverOrder,讲该order实体状态更改为DELIVERED;

(3)、同样的流水号123扣款请求再次到达,这时候查询支付记录表,发现该流水号123已经支付过了,遂返回步骤时的支付结果和状态(返回第1步的状态码:支付成功
       因为幂等性,要求的就是幂等,相同业务请求,每次结果返回一样)

 

8、redis限制(单位时间内)IP访问次数的方法

https://www.php.cn/redis/447243.html

9、redis实现分布式锁

https://www.cnblogs.com/linjiqin/p/8003838.html

10、Redisson实现分布式锁---原理

https://www.cnblogs.com/qdhxhz/p/11046905.html

https://www.jianshu.com/p/de5a69622e49

11、zookeeper实现分布式锁:

https://blog.csdn.net/sunfeizhi/article/details/51926396

https://www.cnblogs.com/jing99/p/11607094.html

12、redis有序集合ZUNIONSTORE命令

http://doc.redisfans.com/sorted_set/zunionstore.html

13、如何使用redis使用排行榜的问题

https://www.php.cn/redis/457932.html

https://segmentfault.com/a/1190000002694239(同上篇文章思路相同)

14、ZUNIONSTORE 和 ZINTERSTORE 是用于有序集(sorted set)区别:

根据文档的说明:

  • ZUNIONSTORE 用于计算给定的一个或多个有序集的并集。

  • 而 ZINTERSTORE 则用于计算给定的一个或多个有序集的交集。

参考:https://blog.huangz.me/diary/2013/another-usage-of-zunionstore-and-zinterstore.html

 

 

九、消息队列

1、Kafka如何保证消息的顺序性

https://www.cnblogs.com/windpoplar/p/10747696.html

2、Kafka如何保证百万级写入速度已经保证不丢失不重复消费

https://cloud.tencent.com/developer/article/1496113

3、Spring Boot 整合 RocketMq

https://www.jianshu.com/p/8c4c2c2ab62e

4、rocketmq怎么保证队列完全顺序消费?

https://www.zhihu.com/question/30195969

 

十、算法数据结构

1、LeetCode题解:https://www.zybuluo.com/Yano/note/250681

 

十一、设计模式

1、建造者(Builder)模式

https://www.jianshu.com/p/afe090b2e19c   (HttpClientBuilder,还有HystrixCommand的构造方法,都是这种设计模式)

2、设计模式在外卖营销业务中的实践

https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651751455&idx=1&sn=b67a0fe617f1f1d3a6ee2217f7b4e853&chksm=bd125d528a65d44424b60a3c9890fe36773da7b2b4c1df9cea33c61936133718571d78e44207&scene=21#wechat_redirect

 

十二、开放型项目问题:

1、互金账户系统如何应对高并发、热点账户等问题

https://www.cnblogs.com/yixinjishu/p/11526167.html

 

十三、通信相关

1、MSL、TTL和RTT简介

https://blog.csdn.net/wangfeng2500/article/details/7649972

2、三次握手、四次挥手视频: https://www.bilibili.com/video/BV1si4y137pa/?spm_id_from=333.788.videocard.0 (视频后20分钟)

(https://www.bilibili.com/video/BV1si4y137pa/?p=2 第二段)

3、TCP连接的TIME_WAIT和CLOSE_WAIT 状态解说

https://www.cnblogs.com/kevingrace/p/9988354.html

4、TCP/UDP常见端口-工具箱

http://tool.aerfo.com/port

5、get和post的区别

https://www.zhihu.com/question/28586791

https://segmentfault.com/a/1190000018129846

https://www.cnblogs.com/logsharing/p/8448446.html

 

十四、环境相关

1、java代码格式化模板(阿里代码规范)

https://www.jianshu.com/p/9befe7710176?tdsourcetag=s_pctim_aiomsg

2、IntelliJ IDEA插件系列:五大装逼神器

https://zhuanlan.zhihu.com/p/32246444

3、git命令:

http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

https://www.jianshu.com/p/93318220cdce

4、Git版本回退的最佳方式

https://www.cnblogs.com/aligege/p/10221174.html

 

十五、生产问题分析:

1、Java如何生成Heap Dump及OOM问题排查:

https://www.jianshu.com/p/91ee6476848c

2、在JVM出现内存溢出或泄露时,为便于排查和定位,需要JVM的启动上增加相应的参数。主要是GC日志和内存DUMP参数:

Oracle  JVM 
-Xloggc:${目录}/managed1_gc.log 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=${目录} 

https://blog.csdn.net/jiafu1115/article/details/51801425

3、Spring MVC注解故障追踪记 (美团技术博客)

https://tech.meituan.com/2016/09/30/mt-trip-springmvc-service-annotation-problem-research.html

 

 

十六、金融业务相关:

1、核心银行系统 之一 历史与发展

https://www.jianshu.com/p/87e5ce0b75f6

 

十七、Github优秀Java开源项目

1、Java详细基础知识

https://github.com/JeffLi1993/java-core-learning-example

2、Java进阶高级用法学习

https://github.com/crossoverJie/JCSprout

3、各种算法(Java语言实现):

https://github.com/TheAlgorithms/Java

4、设计模式大全(Java语言实现):

https://github.com/iluwatar/java-design-patterns

5、springboot开源项目:

https://github.com/spring-projects/spring-boot

6、一份涵盖大部分Java程序员所需要掌握的核心知识(学习+面试)

https://github.com/Snailclimb/JavaGuide

7、mall电商系统:

包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

https://github.com/macrozheng/mall

8、秒杀系统:

高并发大流量如何进行秒杀架构,而做的一个系统整理,包含 MQ、SpringBoot、Redis、Dubbo、ZK 、Maven,lua知识面

https://github.com/qiurunze123/miaosha

9、后端架构师成长拓扑图:

https://github.com/xingshaocheng/architect-awesome

10、互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识,后端同学必看

https://github.com/doocs/advanced-java

11、Java工程师成神之路

https://github.com/hollischuang/toBeTopJavaer

12、良心推荐——Java后端实战项目案例,你遇到过吗?:

https://www.colabug.com/2018/1017/4936873/

 

十七、视频学习:

1、微服务架构 2.0:  https://www.bilibili.com/video/BV1et411T7Rt?from=search&seid=14849922782067447239

2、亿级流量电商详情页系统实战(第二版):  https://www.bilibili.com/video/BV12E411C7uD?from=search&seid=14849922782067447239

3、Spring框架底层源码全集:https://www.bilibili.com/video/av64727761?from=search&seid=13139367834251737368

4、Java8新语法:https://www.bilibili.com/video/BV1ut411g7E9?from=search&seid=15470977063761546803

5、jvm面试题: https://www.jianshu.com/p/21b4c00fc613

6、java架构师之分布式专题:

https://www.bilibili.com/video/av55203891/?p=1

7、Java架构师教程-蚂蚁课堂一期:

https://www.bilibili.com/video/av55342111/?p=1

8、电商项目实战视频教程—Java大型项目:

https://www.bilibili.com/video/av55342111/?p=1

9、淘淘商城电商项目实战:

https://www.bilibili.com/video/av61285860/?p=1

10、大型项目实战:电商用户行为分析大数据平台:

https://www.bilibili.com/video/av71475171?from=search&seid=2489057232679810935

11、java项目实战之springBoot分布式尚筹项目:

https://www.bilibili.com/video/av62270601?from=search&seid=2489057232679810935

12、git学习视频:

https://www.bilibili.com/video/av46939522?from=search&seid=10245806155528795134%EF%BC%88%E8%AF%A6%E7%BB%86%EF%BC%89

13、Linux学习视频:

https://www.bilibili.com/video/av23360560?from=search&seid=6084523518611207229

14、电子科技大学视频:https://www.bilibili.com/video/BV1MJ411a7E2?from=search&seid=3565765131989638091

你可能感兴趣的:(各种学习链接)