CodeZLei

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

请求的顺序
过滤器-->servlet-->拦截器-->Controller
拦截器和过滤器的区别
拦截器是spring中的可以拦截类中的方法,里面可以注入bean,不依赖于web应用
过滤器是java web中拦截servlet的 应用于web程序,不能使用spring bean 注入
tomcat 优化
1.修改jvm的参数
2.修改连接器的配置
3.修改为NIO或者APR
4.去禁用tcp的连接器ajp
5.开始使用tomcat的线程池
java中的线程中断
java线程 和中断相关的 三个方法
1. isInterrupted() 判断是否有线程中断标志位
2. interrupt() 为线程设置中断标志位
3. interupted() 判断线程时候被中断,并清除中断标志位
java 线程中的几种状态
new 新建
runnable 可运行
blocked 阻塞
waiting 等待
timed_waiting 指定时间等待
terminated 结束

新建和结束状态--->对线程中断时屏蔽的
可运行和阻塞--->可以设置线程中断标志位,但是并不是强制终止线程
等待和指定时间等待--->直接报出异常,并清空中断标志位

如果为线程设置了中断标志位,线程会自己结束自己
java 中的锁
synchronized 和 ReenTrantLock的区别
区别:ReenTrantLock 可以设置较多参数设置.指定公平锁还是非公平锁
有condition唤醒指定的线程,提供线程中断的.synchronized 是java提供的关键字,
是java内置的语言特性,而ReenTrantLock 是一个实现的lock接口的类,属于编程式的锁
synchronized不用自己释放锁,而ReenTrantLock需要自己去释放锁,否则的话容易死锁.
Lock 中的方法
lock()方法是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。
tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。
lockInterruptibly()方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。
lock的其他实现类
ReentrantReadWriteLock impl ReadWriteLock 读写锁 提供读写操作
java.ThreadLocal
1.如何实现线程安全
每个thread类中都有一个变量 threadlocalmap 它是依赖于线程的存在的,不会存在多线程访问的问题
2.如何避免内存泄漏
2.1 map的key 是 threadlocal的弱引用, 在调用get/set/remore方法的时候回根据 key是否是空来释放value
2.2 一般使用我们的threadlocal都是静态的,线程是线程池,比较容易造成内存泄漏,可以在使用完毕之后主动调用remore方法防止内存泄漏
线程的几种状态
新建 就绪 运行 阻塞 死亡
TCP和UDP
对比
TCP:面向连接,可靠,双工,1对1
UDP:无连接,不可靠,单工,1对多
TCP为什么握手需要三次挥手需要四次?A向B发送断开连接操作
TCP是双工的,如果是A发起前两次挥手只是仅仅表示,A没有数据发送了,B不用接收A发送的数据了,
而B有可能还会继续向A发送数据,所以B的关闭请求和关闭接收要分开操作
四次挥手释放连接时,等待2MSL的意义?
防止第四次挥手的报文没有发出去,获取没有接收到,,2MSL接收到重传的数据
类加载器
三种
Bootstrap 类加载器
Extension 类加载器
Application 类加载器
特性
委托: 向上委托 先看父类,有:加载,没有:看子类
单一性: 一个类只能有一个类加载器
注解
元注解
是否显示在文档中
注解存在的位置
注解存在的时间
是否允许子类集成
可以在注解类上添加属性,在使用注解的时候可以给属性赋值
java 中的强软弱虚 引用
强引用:我们常用的引用的方式
软引用:JVM内存不够用的时候回收对象
弱引用:jvm直接回收对象
虚引用:主要用于跟踪垃圾回收的状态,对象回收之前会把在队列里面 一般用于对象回收之前判断回收状态,并采取比较的行动
java 中的线程
newCachedTreadPool 可缓存的线程池
newFixedTreadPool 定长的线程池
newScheduledTreadPool 定长的线程池,支持任务定时进行
newsingleTreadExecutor 单个线程的线程池,任务队列

ThreadPoolExecutor的相关的参数
corePoolSize: 核心线程数 一直存活
maximumPoolSize: 最大线程数,线程请求超过这个数的线程会阻塞
keepAliceTime: 非核心线程数的闲置超时时间,超过这个时间会被回收
unit: keepAliceTime: 的单位
workQueue: 线程池的任务队列
threadFactory: 线程工厂,创建新线程的方式
RejectedExecutionHandler:线程资源被用完,添加新线程被拒绝是调用的方法
workQueue:
SynchronousQueue
超出最大线程数量就会报错
LinkedBlockingDeque
会有一个任务队列,超过核心线程数量会放在任务队列中,如果任务队列有大小限制,
则超出的任务数量会去执行,但是线程运行的总数不会超过最大线程数量,如果超出则会出现异常

java 中的 线程相关的类
CountDownLatch\CyclicBarrier\Semaphore\Exchanger
线程开始计数\线程屏障\控制访问资源的线程数量\交换线程数据
mybatis
1.延迟加载数据
2.一级缓存
3.二级缓存

MySQL 表的设计优化

mysql 中的锁
表锁(适合查询):开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
行锁(适合并发修改):开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

共享锁:也叫读锁,简称S锁,原理:一个事务获取了一个数据行的共享锁,其他事务能获得该行对应的共享锁,但不能获得排他锁,即一个事务在读取一个数据行的时候,其他事务也可以读,但不能对该数据行进行增删改。
  排他锁:也叫写锁,简称x锁,原理:一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁(排他锁或者共享锁),即一个事务在读取一个数据行的时候,其他事务不能对该数据行进行增删改查。
  意向共享锁,简称IS,其作用在于:通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加共享锁,那么此时innodb会先找到这张表,对该表加意向共享锁之后,再对记录A添加共享锁。
  意向排他锁,简称IX,其作用在于:通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加排他锁,那么此时innodb会先找到这张表,对该表加意向排他锁之后,再对记录A添加共享锁。

注意点
对于select 语句,innodb不会加任何锁,也就是可以多个并发去进行select的操作,不会有任何的锁冲突,因为根本没有锁。
对于insert,update,delete操作,innodb会自动给涉及到的数据加排他锁,只有查询select需要我们手动设置排他锁。

InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

mysql 事务
read uncommitted
            脏读
read committed(添加了行级共享锁)
            脏读不可重复读
repeatable read(添加了行级排它锁)
            不可重复读
serializable(添加了表级排它锁)
            虚读/幻读
mysql 索引
普通索引,主键索引,联合索引,唯一索引
mysql存储引擎
MyISAM
不支持事务,表级锁,非聚簇索引,查询快
Innodb
支持行级锁,聚簇索引,适合数据量大的情况,修改快






















































posted on 2019-03-11 10:14  CodeZLei  阅读(103)  评论(0编辑  收藏  举报