一些疑惑

一、synchronized (类名.class)、synchronized (this.getClass())与synchronized (this)的区别???spring

网上一些说法:session

(1)类名.class叫作“类字面量”,因class是关键字, 因此类名.class编译时肯定。getclass()运行时根据实际实例肯定,getClass()是动态并且是final的。(2)对于静态方法,因为此时对象还未生成,因此只能采用类锁;只要采用类锁,就会拦截全部线程,只能让一个线程访问;对于对象锁(this),若是是同一个实例,就会按顺序访问,可是若是是不一样实例,就能够同时访问;若是对象锁跟访问的对象没有关系,那么就会都同时访问。并发

二、关于常量池是存在堆区仍是存在堆区外的方法区???mvc

  https://blog.csdn.net/u014039577/article/details/50377805/,此博客交代常量池在jdk1.7时移至堆中,在jdk1.8时移除了永久代,用元空间以取代之,其评论也有些说明。框架

三、一开始不理解为什么ThreadLocal类中的initialValue()方法返回的是null,由于在get()方法中若是取得的ThreadLocalMap为null就进入setInitialValue()方法,在setInitialValue()方法中调用initialValue()方法返回的value为null,一开始始终不理解为啥在没有ThreadLocalMap的状况下给它一个null的值,而后看到了HibernateUtil工具类中获取session方法的时候,因为ThreadLocal没有重写initialValue()方法,ThreadLocalMap的值始终为null,因此调用其get()方法返回的为null,在此状况下就能够用set()方法将session塞进线程局部变量中。高并发

四、在service实现层中定义全局变量在高并发的状况下会出现问题,由于在系统采用springmvc框架的状况下,springmvc核心控制器DispatcherServlet 默认为每一个controller生成单一实例来处理全部用户请求,因此在这个单一实例的controller中,它的XXXService也是一个实例处理全部请求,这样XXXService的成员变量就被全部请求共享。这样就会出现并发请求时变量内容被篡改的问题。对于针对全局变量被篡改的状况能够经过定义局部变量或者定义全局本地线程变量ThreadLocal来解决。但在使用ThreadLocal时不知道会不会影响性能。百度了一下,ThreadLocal仍是能够采起的。工具