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
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