java

synchronized详解

问题 某实例未执行过锁代码块,该实例的标识位是101还是001? 轻量级锁和重量级锁执行完成锁代码块后的标识位分别是什么? 轻量级锁执行完锁代码块后,出现其他线程竞争锁,该线程竞争成功后是什么锁? synchronized是否可降级? java对象Mark Word 32位Header Mark Word 即32bit,4个字节 64位Header Mark Word |------------------------------------------------------------------------------|--------------------| | Mark Word (64 bits) | State | |------------------------------------------------------------------------------|--------------------| | unused:25 | identity_hashcode:31 | unused:

  • 凯文
9 min read
java

java基础之二进制存储

原码、反码和补码 在计算机内,定点数有3种表示法:原码、反码和补码 原码 二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码 正数的反码与其原码相同; 负数的反码是对其原码逐位取反,但符号位除外;即对其原码的绝对值取反,如 10001010的反码为11110101 补码 正数的补码与其原码相同;负数的补码是在其反码的末位加1。 byte jvm byte存储方式 Java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“

  • 凯文
3 min read
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
java

synchronized&monitor

synchronized、monitor、wait、notify Synchronize是java中解决并发问题比较常用的一种方法。从语法上面来说synchronized总共有三种用法。修饰普通方法,修饰静态方法,和同步代码块。 我们对同步代码块的方法进行反编译,可以发现,在synchronized囊括的代码中分别有monitorenter和monitorexit两个指令。虚拟机规范中对着两个指令如下描述:每个对象都有一个monitor。当monitor被占用的时候就会处于锁定状态。当线程monitorenter指令尝试获取monitor所有权时,如果进入数为0,则该线程进入,将进入数设置为1,该线程几位monitor的所有者。其他的线程在进入的时候就会进入阻塞状态,知道monitor的进入数量为0.而monitorexit会对进入数量减1,当变为0的时候,monitor就不再被这个线程占用。 而对synchronize修饰的方法反编译的时候发现,方法没有在使用monitorenter和monitorexit来实现,但是在方法的flags中acc——synchronized的标志。当调用acc_synchronize标志的方法的时候也会先去获取monitor对象,所以本质上和同步代码块是一样的。 同步代码块的monitor来自指定对象,

  • developer
3 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内存屏障

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

  • 凯文
4 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