架构探险学习笔记

1.Spring常用注解:http://blog.csdn.net/w410589502/article/details/51861296
2.servlet标准不允许在web容器内自行做线程管理,quartz的问题确实存在。对于Web容器来说,最忌讳应用程序私自启动线程,
自行进行线程调度,像Quartz这种在web容器内部默认就自己启动了10线程进行异步job调度的框架本身就是很危险的事情,
很容易造成servlet线程资源回收不掉,所以我一向排斥使用quartz。
1.AOP框架本质上可以理解成一个拦截器框架,但是这个拦截器会在拦截一个类时直接拦截了类种所有的方法。
  于是出现切面(Advisor),直接切入到具体的方法中进行拦截
2.除了RegexMehodPointcutAdvisior外,
   DefaultPointcutAdvisor:默认切面,可用于扩展自定义切面
   NameMatchMethodPointcutAdvisor:根据方法名称进行匹配的切面;
   StaticMethodMatcherPointerAdvisor:用于匹配静态方法的切面
3.ThreadLocal:用于存放线程的局部变量,作为一个容器,解决多线程并发问题
   public void set(T value):将值放入线程局部变量中    
   public T get():从线程局部变量中获取值
   public void remove():从线程局部变量中移除值(有助于JVM垃圾回收)
   protected T initialValue():返回线程局部变量中的初始值(默认为null);一般有开发人员实现,设置初始值
4.事务隔离级别:
   READ_UNCOMMITTED
   READ_COMMITTED
   REPEATABLE_READ
   SERIALIZABLE
   从上往下,级别越来越高,并发性越来越差,安全性越来越高
 MySql数据库的默认事务隔离级别:READ_COMMITTED
5.Spring中的事务管理
  PROPAGATION_REQUIRED:如果没有就新建一个事务;如果有,就加入当前事务。Spring的默认事务传播行为
  PROPAGATION_REQUIRES_NEW:如果没有,就新建一个事务,如果有,就将当前事务挂起
  PROPAGATION_NESTED:没有则创建,有,就在当前事务中嵌套其他事务
  PROPAGATION_SUPPORTS:没有则以非事务执行;有则使用当前事务
  PROPAGATION_NOT_SUPPORTED:没有则以非事务执行;有则将当前事务挂起
  PROPAGATION_NEVER:没有则以非事务执行;有则抛出异常
  PROPAGATION_MANDATORY:没有就抛出异常;有,则使用当前事务
6.spring主要用于解耦,bean管理;spring mvc是spring是个组件,构建web程序的mvc实现
   面向切面编程,主要用户日志功能、事务。
   DOM解析方式是将整个XML加载在内存中解析;SAX方式不是整个加入内存中;jdom:dom4j性能优异。灵活性好,功能强大
   spring lazy-init,懒加载,再调用的时候用再加载;init-method:初始化方法,创建成功后调用factory-mathod
   垃圾回收器,通常统计引用次数来计算是否可以被垃圾回收;垃圾回收器不可以马上回收内存,object.finalize()
7.分布式部署关注是如何将应用放分开部署,关注的是部署应用,模块化是指一种架构(设计)方式,将相关性的功能放在一起构成模块。关注的是设计。
8.在shiro中权限实际上是一个权限字符串,推荐使用 "资源:操作"格式命名如,product:view(查看产品的权限)
9.WSDL:描述WS是什么,SOAP表示WS里有什么;
   SOAP就是一个信封,一是头,存放需要的特殊属性(一般是没有任何内容的);而是体,存放传输的数据
10.内存关系:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
    在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,
在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。
线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存
变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,
read and load 从主内存复制变量到当前工作内存
use and assign  执行代码,改变共享变量值 
store and write 用工作内存数据刷新主内存相关内容
其中use and assign 可以多次出现
但是这一些操作并不是原子性,也就是 在read load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,
不会产生对应的变化,所以计算出来的结果会和预期不一样
对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的
例如假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值
在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6
线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6
导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况





















posted on 2018-03-06 18:07  xiaojiayu0011  阅读(225)  评论(0)    收藏  举报

导航