Tomcat-为什么要JAVA破坏双亲委派机制
String、StringBuffer、StringBuilder的区别
1.String是字符串常量,用final修饰,StringBuffer和StringBuilder是字符串变量
2.StringBuffer中的方法都是用Synchrionzed修饰的,所以线程是安全的,StringBuilder不保证线程安全
3.运行速度上StringBuilder>StringBuffer>String
因为String对象是一个不断创建新对象不断回收的过程
堆和栈的区别
1.数据结构:
栈,先进先出的一种数据结构
堆,二叉堆类似于二叉树,特点:根节点的值最小(或最大),且根节点的两个子树也是一个堆
2.内存分配
栈,由操作系统自动分配释放
堆,由程序员分配和释放,若程序不释放,结束后可能由OS回收,分配方法类似于链表
3.缓存级别
栈:1级缓存
堆:2级缓存
wait和sleep的区别
1.属于不同的类;sleep属于Thread类中的静态方法;wait属于Object类
2.是否释放锁;sleep不会释放锁;wait方法释放对象锁
3.使用位置;sleep可以在任何地方使用;wait只能在同步方法和同步代码块中使用
4.线程状态;sleep使线程进入阻塞状态;wait方法使线程进入等待队列,使用notify()、notifyAll()或等待制定时间来唤醒当前线程
5.异常捕获;sleep必须捕获异常,sleep过程中可能被其他对象调用的interrupt()从而产生interruptedException,如果不捕获,线程会异常终止,进入终止状态
Synchronized和Lock的区别
1.来源:synchironized是java的一个关键字;Lock是一个接口
2.异常是否释放锁:synchronized异常会释放锁,因此不会死锁;Lock必须手动释放锁
3.是否响应中断:synchronized只能等待锁释放;Lock可以用interrupt来中断
4.是否知道锁状态:synchronized不能获取到;Lock可以通过tryLock来知道
5.可重入:Lock可以通过ReadWriteLock来实现可重入锁
6.性能:竞争不激烈,两者性能差不多;竞争激烈Lock大于Sync
7.调度上:sync使用object的wait、notify、notifyall等调度;Lock使用condition进行调度
synchronized和lock的用法区别
synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
synchironized实现原理
1.同步方法:采用ACC_SYNCHRONIZED标记符来实现同步
方法级的同步是隐式的,同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。当某个线程要访问这个方法时,会检查是否有这个标志,
2.作用在代码块:采用monitorenter和monitorexit两个指令实现同步
Tomcat-组件
Tomcat-责任链
Tomcat-类加载器
Tomcat类加载器
类加载器种类(双亲委派,向上询问,根据目录向下加载)
BootStrapClassLoader (C++)
<JAVA_HOME>/lib
ExtensionClassLoader (JAVA)
<JAVA_HOME>/lib/ext
ApplicationClassLoader (JAVA)
<ClassPath>
自定义加载器
System Class Loader(Tomcat专用,同ApplicationClassLoader)
Common Class Loader(公共,Tomcat与应用共用)
- Catalina Class Loader(加载Tomcat)
- Shared Class Loader(对所有应用共用,不暴露给Tomcat)
- WebApp Class Loader1(打破双亲委派机制,优先加载自己)
- WebApp Class Loader2
- WebApp Class Loader3
类加载器实践
- findClass
- loadClass