MyBatis缓存设计

是网上《深入理解MyBatis原理》缓存相关几篇文章的笔记,通过MyBatis对缓存SPI接口、一级、二级缓存的设计的了解,后面项目中用到缓存或做基础框架设计缓存时可借鉴这里面好的思路。同时缓存作为一项很常用的技术,对项目中的应用进行对比分析,也方便以后更好的技术选型。

SpringMVC请求参数注解两个小问题

记录了项目中遇到的两个简单小问题,@requestBody注解用在Java对象类型的参数前时要求请求体内容为能转成json或其它通过消息转换器转成java对象的类型,不能是form-data上传文件的模式,否则会保不支持的媒体类型错误;
@requestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)RequestParam可以接受简单类型的属性,也可以接受对象类型。 实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

Java中gcRoot和引用类型

GcRoots是Java搜索对象引用是否可达的一组根引用,可能是虚拟机中的本地变量,方法区中的类静态变量,常亮对象,或者是本地方法栈里的本地方法对象等。

多进程多线程的选择

进程是操作系统资源分配的单位,共享资源不方便也不需要同步;线程是调度执行的基本单位,共享资源方便,但同步操作复杂。一般计算密集、切换频繁的应用会选择多线程模型,而追求稳定性、可靠性(故障互不影响)的应用可采用多进程模型。

聊聊Java happens-before原则

为保证程序的正常执行,硬件、JVM、编译器在优化java程序时必须要遵守Happ-before原则。

  1. 单线程内执行结果和按代码编写顺序执行结果不变;
  2. 对一个锁定对象,要先有解锁操作后才有再次获得锁操作;
  3. volatile变量的写操作先与这个变量的读操作发生;
  4. 传递规则,操作A先于B、B先于C,则A必定先于C发生;
  5. 线程对象的start方法先于线程内每个动作前执行;
  6. 线程对象的中断操作先于线程检测到中断事件的发生;
  7. 线程对象内的操作都先于对象终止操作;
  8. 对象的初始化先于它的finalize方法执行;

Java中的单例模式

Java中单例是常用但也很难的模式,单例模式一般是类自己创建自己的实例并对外提供,同时拥有私有构造函数不允许外界在创建它的实例,更严格的可能要考虑不让外界通过clone、反射、序列反序列化机制来创建实例。一般推荐用枚举方式实现。