一些疑惑
1、synchronized (类名.class)、synchronized (this.getClass())与synchronized (this)的区别???
网上一些说法:
(1)类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定。getclass()运行时根据实际实例确定,getClass()是动态而且是final的。(2)对于静态方法,由于此时对象还未生成,所以只能采用类锁;只要采用类锁,就会拦截所有线程,只能让一个线程访问;对于对象锁(this),如果是同一个实例,就会按顺序访问,但是如果是不同实例,就可以同时访问;如果对象锁跟访问的对象没有关系,那么就会都同时访问。
2、关于常量池是存在堆区还是存在堆区外的方法区???
https://blog.csdn.net/u014039577/article/details/50377805/,此博客交代常量池在jdk1.7时移至堆中,在jdk1.8时移除了永久代,用元空间以取代之,其评论也有些说明。
3、一开始不理解为何ThreadLocal类中的initialValue()方法返回的是null,因为在get()方法中如果取得的ThreadLocalMap为null就进入setInitialValue()方法,在setInitialValue()方法中调用initialValue()方法返回的value为null,一开始始终不理解为啥在没有ThreadLocalMap的情况下给它一个null的值,然后看到了HibernateUtil工具类中获取session方法的时候,由于ThreadLocal没有重写initialValue()方法,ThreadLocalMap的值始终为null,所以调用其get()方法返回的为null,在此情况下就可以用set()方法将session塞进线程局部变量中。
4、在service实现层中定义全局变量在高并发的情况下会出现问题,因为在系统采用springmvc框架的情况下,springmvc核心控制器DispatcherServlet 默认为每个controller生成单一实例来处理所有用户请求,所以在这个单一实例的controller中,它的XXXService也是一个实例处理所有请求,这样XXXService的成员变量就被所有请求共享。这样就会出现并发请求时变量内容被篡改的问题。对于针对全局变量被篡改的情况可以通过定义局部变量或者定义全局本地线程变量ThreadLocal来解决。但在使用ThreadLocal时不知道会不会影响性能。百度了一下,ThreadLocal还是可以采取的。