JavaSE和JavaWeb中哪些令人兴奋的事
2018-10-26 本文已影响5人
帅可儿妞
兴奋?嗯,兴奋的事!注意,本页内容都是网上各个地方抄来的
@[TOC]
一、JavaSE
- 线程
-
前台线程和后台线程(守护线程)
- main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。
- 前台线程和后台线程的区别和联系:
♠ 后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
♠ 可以在任何时候将前台线程修改为后台线程,方式是通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。
♠ 不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
♠ 托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
♠ 说明:应用程序的主线程以及使用Thread构造的线程都默认为前台线程,使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序;
-
volatile: 只保证线程在“加载数据阶段”加载的数据是最新的,并不能保证线程安全。(volatile只保证多线程操作的可见性,不保证原子性);
-
线程中常见的类的作用:
- CopyOnWriteArrayList适用于写少读多的并发场景
- ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率;
- ConcurrentHashMap是同步的HashMap,读写都加锁;
-
JVM配置参数
- -Xmx:最大堆大小
- -Xms:初始堆大小
- -Xmn:新生代大小
- -XXSurvivorRatio:新生代中Eden区与Survivor区的大小比值
-
对于:-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
♠ 新生代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将新生代分为5份,每个Survivor区占一份),总大小为2048m。-Xms初始堆大小即最小内存值为10240m
image.png
image.png
-
常见配置汇总
- 堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置新生代大小
-XX:NewRatio=n:设置新生代和年老代的比值。如:为3,表示新生代与年老代比值为1:3,新生代占整个新生代年老代和的1/4
-XX:SurvivorRatio=n:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxPermSize=n:设置持久代大小 - 收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器 - 垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename - 并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) - 并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
- 堆设置
-
-
构造派生对象顺序
- 父类静态域
- 子类静态域
- 父类成员初始化
- 父类构造块
- 父类构造方法
- 子类成员初始化
- 子类构造块
- 子类构造方法
-
BlockingQueue
- 是一个接口:阻塞队列:实现类有ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue;
- 容易混淆的操作:
- LinkedBlockingQueue从队列中取出并移除头元素的方法有:poll,remove,take。区别如下:
♠ poll:若队列为空,返回null。
♠ remove:若队列为空,抛出NoSuchElementException异常。
♠ take:若队列为空,发生阻塞,等待有元素。 - LinkedBlockingQueue向队列尾部添加元素:add,区别如下:
♠ add方法在添加元素的时候,若超出了度列的长度会直接抛出异常:java.lang.IllegalStateException: Queue full
;
♠ put方法向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间来加入元素;
♠ offer方法如果发现队列已满无法添加的话,会直接返回false;
- LinkedBlockingQueue从队列中取出并移除头元素的方法有:poll,remove,take。区别如下:
二、JavaWeb
-
Spring和SpringMVC
- 事务的传播属性:PROPAGATION
-
PROPAGATION_REQUIRED
:若当前没有事务,就新建一个事务,若已经存在一个事务中,加入到这个事务中;默认; -
PROPAGATION_SUPPORTS
:支持当前事务,若当前没有事务,就以非事务方式执行; -
PROPAGATION_NOT_SUPPORTED
:以非事务方式执行操作,若当前存在事务,就把当前事务挂起; -
PROPAGATION_MANDATORY
:强制使用当前的事务,若当前没有事务,就抛出异常; -
PROPAGATION_REQUIRES_NEW
:新建事务,若当前存在事务,把当前事务挂起;内部事务回滚了,外部事务仍然可以提交; -
PROPAGATION_NEVER
:以非事务方式执行,若当前存在事务,则抛出异常; -
PROPAGATION_NESTED
:若当前存在事务,则在嵌套事务内执行;若当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作;
-
- Servlet中客户机状态追踪
- Java Servlet API 中引用 Session 机制来追踪客户的状态。Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。
- 当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。
- 当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。 Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。
- HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
该方法的实现机制为:
♠ 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。
♠ 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
我们可以对网页中的链接稍作修改,解决以上问题:
修改前:
修改后:<a href="<page-name>.jsp">
<a href=“<%=response.encodeURL("<page-name>.jsp")%>“>
- 事务的传播属性:PROPAGATION
-
MyBatis和JDBC