Skip to content

Latest commit

 

History

History
105 lines (84 loc) · 6.06 KB

2019年04月15日第4周周记.md

File metadata and controls

105 lines (84 loc) · 6.06 KB

生活随记

  • 本周打码比较多,又开始忙了,社团赶上APP大赛举办,很多事情

本周新知

  • 了解七大开源许可证
  • cookie与session
  • servletcontext和servletconfig
  • 并发访问的线程安全问题
  • 数据库的脏读,不可重复读

本周实践

  • 给自己的代码添加阿帕奇许可证

  • 大量使用反射机制和策略模式简化代码

  • 条件查询,模糊查询,分页查询

  • 尝试正则表达式

本周学习与思考

  • static的相关思考(还没写笔记)

Java的内存分区

线程共享:堆区,方法区(包括常量池)
  • 堆区:整个虚拟机只有一个,所有线程共享,用来动-态开辟来创建对象,堆区是所有线程和对象共享,用来存放运行时需要的数据(对象),并且自动初始化
  • 方法区:堆区的一个特殊部分,堆区中划定一部分存储永远不变的量(类的方法代码,类的常量,静态变量,),作为方法区
线程独享:程序计数器,虚拟机栈,本地方法栈
  • 虚拟机栈区:一个线程独享,用来进行方法的执行,先进先出,存放一些执行方法需要的量(参数,局部变量,基本类型变量和对象句柄即引用)
  • 本地方法栈,给Native方法使用的栈
  • 程序计数器(PC寄存器)

浅克隆和深克隆

  • 如果是浅克隆,只是对普通类型成员变量的值和引用类型的成员变量的引用进行复制,并没有对引用类型变量重新创建对象,这样克隆对象线程不安全
  • 深克隆时,引用类型变量会重新创建一个对象再把地址赋值给克隆出来的对象
  • 如果要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现。

String,StringBuilder,StringBuffer

  • Sting对象具有不变性,每次修改都会创建新的对象
  • StringBuilder和StringBuffer的区别在于线程是否安全,StringBuffer线程安全,代价是性能开销更大

线程安全与单例模式

并发和并行
  • 并发其实是单个处理器在不同时间轮换执行多个线程,达到看似同时进行的效果,而并行是多个处理器同时执行多条指令
  • 多线程和多进程都- 可以实现并发,但是进程拥有自己的独立资源,有独立的内存空间,多个进程间不能共享数据,而线程虽然也有自己独立的堆栈,程序计数器和局部变量,但是多个线程共享父进程的共享变量和部分环境
  • 线程安全问题,就发生在多线程共享资源上
同步监视器
  • 可以用来解决线程安全问题,主要思想在于锁定某个可能被并发访问的对象,这个对象就作为同步监视器,线程在执行同步代码块之前必须获得对同步监视器的锁定,并且任一时刻只能有一个线程获得对同步监视器的锁定。
  • 同步代码块:在代码块上使用synchronized关键字指定一个作为同步监视器的对象, 当同步代码块执行完毕,线程就会释放对同步监视器的锁定
  • 同步方法:直接在方法上使用synchronized关键字,无需指定同步监视器,默认是this,也就是调用该方法的对象。
可变类和不可变类:
  • 其对象的状态不可以被改变,没有状态信息的类,比如工具类,就没有线程安全问题
  • 对象状态可以改变,具有可以被改变的成员属性的类,比如User类,就存在线程安全问题。单例模式会产生全局性,具有不可共享资源的类和具有独立状态信息的类不应该使用单例模式

枚举类

主要思想

  • 待总结。。。

注意问题

  • 定义枚举类使用关键字enum
  • 枚举类都是Enum的子类 -枚举项的最后一个分号可以省略,但是后面如果有内容则不能省略

枚举类的好处

  • 可以给枚举称量提供名称,用来返回错误码
  • 可以给提供抽象方法,枚举常量要重写该方法

枚举类常用方法

  • compareTo:比较索引编号
  • ordinal:返回索引编号
  • name:返回枚举项名称
  • values:返回所有序列值,可用于遍历
  • valueOf:返回枚举项
  • toString:返回枚举项的字符串形式

jsp与servlet的区别和联系

  • jsp编译之后,成为servlet,原来定义的变量会成为servlet的成员变量或者局部变量,代码段会被写到对应的方法中,html代码会被写到方法中作为输出内容

监听器

  • 用来监听servlet/jsp相关对象的事件,实现某个监听器,做出一些设置,当监听器对应的事件发生时,web容器就会调用相应的方法做出处理
ServletContextListener
  • 监听servlet的生命周期,也就是监听servlet的初始化和即将销毁的事件,对这些事件做出响应的监听器
  • 应用:使用ServletContextListener配置单例service,可以让servlet加载时初始化一个单例service对象提供给多个servlet共享
HttpSessionListener
  • 监听HttpSession的生命周期,也就是监听HttpSession的创建和即将销毁的事件,对这些事件做出响应的监听器
HttpRequestListener
  • 监听HttpRequest的生命周期,也就是监听HttpRequest的创建和即将销毁的事件,对这些事件做出响应的监听器

数据库

建表三大范式
  • 第一范式:原子性,指每一列必须是不可分割的
  • 第二范式:每一行记录各个字段应该是一对一关系,如果一对多或者多对多,要分表
  • 第三范式:不要把间接依赖主键的属性加到表中,不然很容易有数据冗余
事务的隔离级别
  • readuncommited:脏读问题
  • readcommited:不可重复读问题
  • Repeatable Read:幻读问题
  • Serializable:严格的事物隔离级别:

Serializable是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。

遇到的问题

  • 配置文件相同的键会被覆盖,因此: 数据库表tb_前缀的作用,在同个配置文件中和类名区别开
  • Response中Write输出内容要使用flush刷新