一、ThreadLocal解决了什么问题
在一些情况下,我们希望对于某一个共享变量,对于不同线程来说都是独一无二的,例如:有一个共享变量x,线程A去对其进行写操作,读操作,线程B也对其进行写操作读操作,而线程A和线程B在去读写x时的感觉,就像是读写一个本地变量一样,完全与外界封闭, 这就是线程封闭的想法。下面有三种线程封闭的实践:
提高查询效率,避免全表扫描;
先说步骤:
show variables like '%quer%';
可以看到一些变量(可以使用set global xx=..;
, 也可以在my.cnf
配置文件里修改,是mysql server的启动配置),其中:slow_query_log
表示满查询日志是否开启;long_query_time
超过了这个时间的将被视为慢查询(一般超过1秒就被视为慢查询, 修改完需要重新获取connection)slow_query_log_file:
慢查询日志保存位置show status like '%slow_queries%' ;
查询下面这个变量Slow_queries
: 慢查询的数量 ( 客户端重新连接时,这个数据会被清0 )即<bean id=.. class=.. />
, 则默认调用无参构造函数来创建bean,并装入容器中. 此时如果类中没有默认构造函数,那么对象将无法被创建
1 | <bean id=".." class=".."> |
以GC ROOT为起点进行扫描,能够被扫描到的对象,都是存活的对象,而无法被扫描到的对象,就是“垃圾”,需要被回收。GC ROOT一般包括但不限于:
可达性分析是通过 “GC ROOT” 和对象引用来完成的可达性分析,GC ROOT上面已经说过了,这里主要说说对象引用。 如果对象引用只有 :被引用 和 没被引用,那么对于描述一些“食之无味,弃之可惜”的对象就显得无能为力。 例如,对于有些对象,我们希望在内存足够多的时候保留,内存吃紧的时候被回收(例如缓存),或是对于有些对象我们希望当仅仅被某个特殊引用引用着时被回收(WeakHashMap)等,仅靠 “被引用”和“未被引用” 这两个状态,显然无法满足一些特殊情况的要求,为此,在JDK1.2之后,Java对引用概念进行了扩充。
在啃Spring的AOP之前,在复习以下动态代理及其实现方式
在不使用代理模式的场景下,对象A想使用对象B的功能,一个方法是通过持有对对象B的引用,然后直接使用对象B提供的服务了。
而使用了代理模式,则引入一个第三方的代理对象,这个代理对象持有着对对象B的引用,可以调用对象B的服务与资源,而如果有对象希望使用对象B提供的服务的话,则不再去找对象B,而是去找这个代理对象。 如下图所示。
很多思想都是通过引入一个第三者来去实现某个功能,使得程序耦合度更低,或者提高代码复用性等等,例如发布-订阅模式,控制反转,领域模型的思想等等,而这里的代理模式,也是引入了一个第三者(代理对象),这个对象对外提供的接口仅仅是对某一主要功能的服务接口,代理对象内部持有真正提供这一服务的对象,通过它们来调用服务,同时,在代理对象这一层面对方法进行增强。。。