java

Sychronized实现原理

sychronized class反编译 在源代码层面,似乎看不出synchronized的实现原理。锁与不锁的区别,似乎仅仅只是有没有被synchronized修饰。不如把目光放到更加底层的汇编上,看看能不能找到突破口。 javap 是官方提供的.class文件分解器,它能帮助我们获取.class文件的汇编代码。具体用法可参考这里。 接下来我会使用javap命令对*.class文件进行反汇编。 编写文件Test.java: public class Test { private int i = 0; public void addI_1(){ synchronized (this){ i++; } } public

  • 凯文
5 min read
network

网络之网桥、交换机等基础概念

集线器(hub) 一个口收到的信号,原封不动的发送给所有其他的口,由其他的口上的设备自己决定是否接收信号。有点类似广播,但是比广播更纯粹。由于hub只是简单的转发,所以hub工作在物理层(L1)。 网桥(bridge) 工作在数据链路层(L2)。以太网中,数据链路层地址就是mac地址,网桥与hub的区别在于,网桥会过滤mac,只有目的mac地址匹配的数据才会发送到出口。一个bridge指的是一个输入到一个输出的桥接。 交换机(switch) 早期的switch,其实可以看成多个bridge的集成设备,因此也工作在数据链路层。一个交换机口的输入到另一个交换机口的输出,可以认为是一个bridging。交换机中的MAC table,实际是为了bridge能工作而存在。一个N口交换机可以看成是 [公式] 也就是

  • 凯文
2 min read
es

es高级之文档操作及segment介绍

segments概念 在Lucene⾥⾯有很多⼩的segment,我们可以把它们看成Lucene内部的mini-index,即为存储的最⼩管理单位。 重要特性:不可变性。 segments结构 Inverted Index Stored Fields Document Values Cache Inverted Index 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。 Term(单词):⼀段⽂本经过分析器分析以后就会输出⼀串单词,这⼀

  • 凯文
18 min read
java

Mybatics执行过程

mybatics mapper的注入过程 在使用mybatics时,通过MapperScan注解 import registrar MapperScannerRegistrar 在MapperScannerRegistrar中会对 ClassPathMapperScanner进行初始化,如setMapperFactoryBean,setSqlSessionTemplateBeanName,setSqlSessionFactoryBeanName等;然后调用ClassPathMapperScanner.doScan方法 在doScan方法中会扫描所有的Mapper,并通过MapperFactoryBean生成对应的代理类,然后将该类注册到spring bean factory中,在初始化BeanDefinition时,会通过RuntimeBeanReference添加需要的属性,如sqlSessionTemplate,sqlSessionFactory等,而sqlSessionTemplate,sqlSessionFactory是在MybatisAutoConfiguration中注入到BeanFactory中的。 MapperFactoryBean继承了SqlSessionDaoSupport,在spring 创建MapperFactoryBean会通过sqlSessionTemplate或sqlSessionFactory生成sqlSession 在执行某个mapper时,执行的是动态代理类,代理类为MapperProxy,该类的getObject()方法通过sqlSession.

  • 凯文
3 min read
java

spring 事务传播机制

spring事务传播配置 在方法上添加以下注解 @Transactional(propagation = Propagation.MANDATORY) propagation的默认值为Propagation.REQUIRED spring一共定义了七种事务传播机制: PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。 PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED

  • 凯文
5 min read
java

java之volatile内存屏障

JVM内存屏障 内存屏障作用 处理器提供内存屏障指令(Memory Barrier): 写内存屏障(Store Memory Barrier):处理器将存储缓存值写回主存(阻塞方式)。 读内存屏障(Load Memory Barrier):处理器,处理失效队列(阻塞方式)。 内存屏障种类 屏障类型 指令示例 说明 LoadLoad Barriers Load1;LoadLoad;Load2 该屏障确保Load1数据的装载先于Load2及其后所有装载指令的的操作 StoreStore Barriers Store1;StoreStore;Store2

  • 凯文
5 min read
java

mybatics拦截器

作用 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis 拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动 Mybatis 固有的逻辑。打个比方,对于 Executor,Mybatis 中有几种实现:BatchExecutor、ReuseExecutor、SimpleExecutor 和 CachingExecutor。这个时候如果你觉得这几种实现对于 Executor 接口的 query 方法都不能满足你的要求,那怎么办呢?是要去改源码吗?当然不。我们可以建立一个Mybatis 拦截器用于拦截 Executor 接口的 query 方法,在拦截之后实现自己的

  • 凯文
3 min read
java

mybatics实现读写分离

开发 DynamicDataSource public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DynamicDataSourceHolder.getDbType(); } public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } } determineCurrentLookupKey(

  • 凯文
5 min read