并发编程实战阅读学习
内存可见性通常我们无法确保执行读操作的线程能适时的看到其他写线程写入的值,为了确保多线程间对内存写入操作的可见性,必须使用同步机制。
加锁与可见性AB线程获取同一个锁,可以保证A中改变的变量,等到B获取锁后仍可以看见。
B线程执行由锁保护的同步代码块时,可以看见A线程之前在同一个同步代码块中的所有操作结果。
可见性即公共变量的可视性、一致性,同步保证并发下不同线程数据变量一致。对于变量来说,锁机制同步是为了确保某个线程写入改变量的值,对于其他线程来说是可见的。
加锁的意义不仅仅局限于互斥行为,还包括内存可见性,为了确保所有线程可以看到共享变量的最新值,所有执行读操作或写操作的线程都必须在同一个锁上同步。
VolatileJava提供一种稍弱的同步机制,volatile关键字,用于确保将变量的更新操作通知到其他线程。
当变量声明为volatile后,编译器和运行时都会注意到该变量是共享的,因此不会将变量上的操作与其他内存操作一起重排序,volatile变量不会被缓存在寄存器或其他处理器不可见的地方,因此在读取volatile变量时总能得到最新写入的值。
volatile不会执行加锁操作, ...
Spel字段解析功能源码浅析
起因最近在写日志功能,aop + 注解 + spel,使用 @RestControllerAdvice 全局捕获到的Exception的异常信息肯定是需要打印的,于是我想当然获取自定义信息的spel表达式是 e.getDetailMessage,detailMessage异常信息字段是异常继承于Throwable的,然后运行代码spel解析出现异常,网上搜一圈无果,只好自己debug看源码,找找原因了。
Debuging题外话,学会debug技巧应该是我们初级后端进阶的第一步,学会debug才好看源码,Evaluate Expression 执行表达式,断点设置条件以及是否线程,这两个小技巧掌握好就可以看源码了。
readPropertydebug步进直到spel判断核心
org.springframework.expression.spel.ast.Indexer#readProperty 关键代码节选
12345678910for (PropertyAccessor accessor : accessorsToTry) { if (accessor.canRead( ...
Spring框架八股
IoC原理https://www.jianshu.com/p/ad05cfe7868e
IoC控制反转,是一种设计思想,将以往通过手动创建对象的控制权交由Spring管理,降低对象之间的耦合性。其控制反转,指的是控制对象创建的权力,然后将控制权反转交给外部环境管理。
所有的Bean在项目启动时生成,加载到Spring容器中统一管理,我们需要使用的时候再去容器中取Bean。而不是单独的去new一个相关类来进行调用。
IoC只是一种思想,而依赖注入DI是具体实现。
实现底层xml配置文件,编写对应属性kv,如k - 类名,v - 类的全路径。
创建一个工厂类解析xml,获取对应类的全路径,并通过反射创建该类对象。
最后从工厂中调用创建好的对象即可。
现在我们开发都是使用注解注入Bean替代xml配置。
AOP简述AOP面向切面编程,能将与业务无关,却被业务模块共同调用的服务进行封装(如工具类等),然后进行统一调用,降低模块之间的耦合性,利于拓展和维护。
AOP基于代理模式实现,其分为静态代理和动态代理。
AspectJ AOP 静态代理
Spring AOP 动态代理(JDK、CGLIB ...
微服务商城项目学习总结
虚拟机环境配置这次使用Virtual Box + Vagrant完成虚拟机安装,比传统VMware配置镜像更方便,Vagrant可下载打包好的镜像文件进行安装,无需详细配置。
https://blog.csdn.net/qq_15990969/article/details/113096469
https://www.cnblogs.com/lxwphp/p/11121283.html
快速反向工程辅助crud使用renren脚手架辅助开发,对应前后端分离,renren-fast,renren-fast-vue,renren-generator使用前需删除.git文件,这是官方的git信息
renren的service层无需注入dao,它继承了一个父类,父类注入了baseMapper,而这个baseMapper的类型是对应继承时类的泛型M的,人人继承这个父类就会用自己的dao实现泛型,所以此时父类注入的baseMapper即我们需要的dao,封装nb。
商品服务https://blog.csdn.net/unique_perfect/article/details/113824202
...
设计模式八股
设计模式七大原则
单一职责原则:一个类只负责一个功能,降低耦合性,方便迭代维护。
开放封闭原则:类、方法可以进行功能扩展,但不能修改。对扩展开放,对修改封闭。
依赖倒置原则:高级模块不能依赖低级模块,都应该依赖于接口。先将类进行抽象,先设计功能接口,再对接口进行功能细节的实现。
接口隔离原则:不同接口定义不同的功能。
里氏代换原则:子类可替换其父类。
迪米特原则:每个模块间要尽可能少的相互调用,减少依赖,降低耦合性。
设计模式讲解链接:
http://www.cyc2018.xyz/%E5%85%B6%E5%AE%83/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20-%20%E7%9B%AE%E5%BD%95.html#%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80
单例模式实现懒汉式(线程不安全)123456789101112public class Lazy { private static Lazy lazyInstance; ...
Spring Cloud简单学习
Spring Cloud简述Spring Cloud微服务是由多功能模块组成的,每个模块实现耦合性降低。
注意微服务是多个模块进行组合,我们对版本的控制必须严谨。
通过url:
https://start.spring.io/actuator/info 获取json数据,查看版本对应关系。
或 https://spring.io/projects/spring-cloud#learn 自行查看版本对应关系。
Spring Cloud模块分布如下:
注册中心:Nacos、Eureka、Zookeeper、Consul
服务调用:LoadBalancer、Ribbon、OpenFeign(Feign)
服务熔断:Sentinel、Resilience4j、Hystrix
服务网关:Gateway、Zuul
服务配置:Nacos、Config
服务总线:Nacos、Bus
Spring Cloud Alibaba官网:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Spring Cloud ...
秽翼的尤斯蒂娅
秽翼的尤斯蒂娅因为自己玩过一些剧情作,所以感觉秽翼在剧情上并没有让人特别惊艳,但是秽翼在角色刻画以及整体世界观的构建上还是做的不错的。打完后最直接的感受就是这是一部佳作,适合萌新入坑,相信不那么完美的结局对萌新来说是一个美好的初体验(笑),特别是结尾CV放完后,我还以为有尾声剧情,没想到直接来了个经典CG,在伤口上撒盐了属于是。
个人感觉秽翼做成全年龄向食用更佳。
最后贴一个漫雨大大的杂谈,分析还是很到位的:https://www.bilibili.com/video/BV174411i73a
nginx简单学习
Nginx网络代理
正向代理(客户端):
即代理客户端的访问,VPN就是典型的正向代理,正向代理中客户端是知道请求的目标的,而服务器不知道客户端是通过中间商访问的,它会认为是VPN的节点在访问。
反向代理(服务端):
当我们访问大型网站时,肯定不是所有人都访问一个服务器,比如访问百度,我们使用外网访问固定url:www.baidu.com,而内网会通过反向代理,将访问请求转发到各地的服务器,是用来代理服务端的访问。
负载均衡根据服务器的情况进行分配,nginx负载均衡有两种策略:内置策略和扩展策略。
内置策略
轮询:均衡分配,一个一个来
加权轮询:按自定义的权重比例进行分配
ip hash:对客户端url请求的ip进行hash,然后根据hash结果分配给对应的服务器,可解决session不共享的问题。
外置策略:即自行设置算法分配
动静分离
相当于nginx对反向代理的实际应用,使用Nginx处理请求,动静分离节省服务器资源。
安装官网自行下载linux版本
http://nginx.org/en/download.html
12345678910# 解压tar -z ...
了解JVM(深入了解Java虚拟机浅读)
122021-12-1 更新记录周志明老师这本书讲的太深了,自己主要针对八股常问的一些点进行了阅读理解,发现网上的好多文章都是来自于此😂,相对于上次背八股的JVM记录,这次浅读对这些点有了一定的理解,确实很细,以后工作了可以再抽空深挖一下虚拟机的其他内容。
Java内存区域运行时数据区域
进程中线程共享:
堆
方法区
进程中线程私有:
程序计数器
虚拟机栈
本地方法栈
程序计数器(一块较小的内存空间)
java是编译成字节码运行,程序计数器可看作当前线程执行字节码的行号指示器。
多线程情况下,程序计数器用于记录当前线程的执行位置,当线程切换回来可知道线程上次运行的位置。
各线程之间程序计数器互不影响,独立存储,这一块内存是线程私有的内存。
虚拟机栈(Java方法)与程序计数器一样,Java虚拟机栈是线程私有的,用于描述Java方法执行的内存模型,每次方法调用数据都是通过栈传递。
虚拟机栈生命周期与线程一样,当方法被执行时,JVM会同步创建一个栈帧(用于存储局部变量表、操作数栈、动态链接、方法出口等信息),每一个方法执行的过程就相当于栈帧在虚拟机栈中入栈到出栈。
Java ...
Java八股文-容器
容器对比集合框架简述
Collection
List:有序,可重复。ArrayList、LinkedList
Set:无序,无重复。HashSet、TreeSet
Queue(Deque):队列,有序,可重复。LinkedList、PriorityQueue
Map:键值对key-value存储,一个键对应一个值。HashMap、TreeMap、HashTable、ConcurrentHashMap
ArrayList与LinkedList的区别
线程安全:二者都不保证线程安全,Vector可以实现线程安全。
底层数据结构:
ArrayList对应数组。
LinkedList对应双向链表,每个结点有前驱后继两个指针。
查找操作多使用ArrayList,插入、删除操作多使用LinkedList。
内存空间占用:
ArrayList由于是数组实现,会预留一定容量空间。整体空间占比高。
LinkedList每一个元素空间占比更高,因为有前驱后继两个指针。
实现RandomAccess接口
由于ArrayList具有快速随机访问的功能,所以它实现了RandomAccess接口,但 ...