0%

Tomcat-为什么要JAVA破坏双亲委派机制

简述

  • Tomcat本身也是一个Web应用程序
  • 不同Web程序依赖不同,向上查询时可能导致依赖版本异常

打破双亲的机制,每个应用独立classloader其实自己做到隔离机制

阅读全文 »

1.String是字符串常量,用final修饰,StringBuffer和StringBuilder是字符串变量

2.StringBuffer中的方法都是用Synchrionzed修饰的,所以线程是安全的,StringBuilder不保证线程安全

3.运行速度上StringBuilder>StringBuffer>String

因为String对象是一个不断创建新对象不断回收的过程

1.数据结构:

栈,先进先出的一种数据结构

堆,二叉堆类似于二叉树,特点:根节点的值最小(或最大),且根节点的两个子树也是一个堆

2.内存分配

栈,由操作系统自动分配释放

堆,由程序员分配和释放,若程序不释放,结束后可能由OS回收,分配方法类似于链表

3.缓存级别

栈:1级缓存

堆:2级缓存

1.属于不同的类;sleep属于Thread类中的静态方法;wait属于Object类

2.是否释放锁;sleep不会释放锁;wait方法释放对象锁

3.使用位置;sleep可以在任何地方使用;wait只能在同步方法和同步代码块中使用

4.线程状态;sleep使线程进入阻塞状态;wait方法使线程进入等待队列,使用notify()、notifyAll()或等待制定时间来唤醒当前线程

5.异常捕获;sleep必须捕获异常,sleep过程中可能被其他对象调用的interrupt()从而产生interruptedException,如果不捕获,线程会异常终止,进入终止状态

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组件

Server

  • Connector(配置端口等参数)
  • Service
    • Executor
  • Engine
    • Host
      • Context1(Servlet容器)
        • Warpper-1
      • Context2(Servlet容器)
        • Wrapper-A

配置

  • server.xml
  • context.xml
  • web.xml

Tomcat责任链

Container

  • Pipeline
    • Valve 1
    • Valve 2
    • Valve 3

对应关键节点

  • Connector -> StandardService
  • StandardEngind
  • EngineValve
  • ErrorReportValve
    • getNext()
      • HostValve
  • ContextValve
  • WrapperValve
  • FilterChain.doFilter
  • servlet.service

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