(10)JSP有哪些内置对象?作用分别是什么?
JSP有9个内置对象:
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web应用的配置对象;
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象。
(11)线程池的使用
引入线程池的原因:
由于线程的生命周期中包括,创建-就绪-运行-阻塞-挂机-结束 阶段,当我们处理的任务数目比较小的时候,我们可以自己创建几个线程来处理相应的任务,但是有大量的任务时,由于创建和销毁线程都需要很大的开销,运用线程池就可以大大的缓解这些内存开销很大的问题。
线程池的使用:
Executor类给我们提供了的静态方法,就可以创建相应的线程池:
[java] view plain copy
<span>public static executorService newSigleExecutor();
public static executorService newFixedThredPool();
public static executorService newCachedThreadPool();</span>
newSignalExecutor()返回一个包含单线程的Executor,将多个任务交给Executor时,这个线程处理完一个任务后会接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代它
newFixedThreadPool()返回一个包含指定数目线程数的线程池,如果任务数量多于线程数目的话,那么没有执行的任务必须等待,直到任务完成为止
newCachedThreadPool()根据用户的任务数目创建相应的线程来处理,该线程池不会对线程的数目加以限制,完全依赖于虚拟机能创建的线程输入,但是可能会引起内存不足。
我们只需要将执行的任务放入run方法中即可,将runable接口的实现类交给线程池的execute方法,作为它的一个参数
(12)tomacat,jvm优化
(13)线程并发问题:valitile:加了volatile修饰符的变量则是直接读写主存。
一旦一个共享变量(类的成员变量、类的静态成员变量)被valitile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作是的可见性,即一个线程修改了某个变量的的,新的值对其它线程来说是立即可见的。
2)禁止进行指令重排序。 指令重排是指处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证各个语句的执行顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。程序执行到volatile修饰变量的读操作或者写操作时,在其前面的操作肯定已经完成,且结果已经对后面的操作可见,在其后面的操作肯定还没有进行。
volitile本质实在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
1)volatile仅能使用在变量级别;
synchronized则可以使用在变量、方法、和类级别
2)volatile仅能实现变量的修改可见性,并不能保证原子性;
synchronized则可以保证变量的修改可见性和原子性
3)volatile不会造成线程的阻塞;
synchronized则可能会造成线程的阻塞
4)volatile标记的变量不会被编译器优化;
synchronized标记的变量可以被编译器优化