脏读:
假如在3点查询一条数据,查询需要10分钟。但是在3点过5分的时候有一条sql改变了你正在查询的数据,3点10分你查询出来的数据还是老数据,这就是脏读。
对象锁,类锁:
synchronized加在静态方法上是给类上锁,synchronized加在非静态方法中是给对象上锁。
如果多线程同时访问一个类的类锁和对象锁,这两个方法执行是异步的,因为这两种是不同的锁。
类锁对该类的所有对象都有用。
sleep,wait:
两者来自不同的类(分别是Thread和Object)。
sleep没有释放锁,wait释放了锁,使得其他线程可以使用同步控制块或方法。
wait只能在同步控制方法或者同步控制块中使用,sleep可以在任何地方调用。
sleep必须捕获异常。
死锁:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在未使用完之前,不能强制剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环资源关系。
在java中所有线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾回收线程。因为每当使用java命令执行一个类的时候,实际上启动了一个jvm, 每个jvm其实就是在操作系统中启动了一个线程
ArrayDeque, (数组双端队列)
PriorityQueue, (优先级队列)
ConcurrentLinkedQueue, (基于链表的并发队列)
.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口)
ArrayBlockingQueue, (基于数组的并发阻塞队列)
LinkedBlockingQueue, (基于链表的FIFO阻塞队列)
LinkedBlockingDeque, (基于链表的FIFO双端阻塞队列)
PriorityBlockingQueue, (带优先级的无界阻塞队列)
SynchronousQueue (并发同步阻塞队列)
ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
SpringMVC工作流程:
1.发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器
3.处理器映射器根据请求的url找到具体的处理器,生成处理器对象及处理器拦截器(拦截器如果有则生成)一并返回给DispatcherServlet
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Controller)
6.Controller执行完成返回ModelAndView对象
7.HandlerAdapter将ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传递给视图解析器(ViewReslover)
9.ViewReslover解析后返回具体的视图(view)
10.DispatcherServlet将具体视图渲染
11.DispatcherServlet响应用户