锁在Java虚拟机中的实现和优化
理解锁在Java虚拟机中的实现和优化之前,我们需要知道对象头和锁的关系。在Java虚拟机的实现中每个对象都有一个对象头,用于保存对象的系统信息。对象头中有一个称为Mark Word的部分,它是实现锁的关键,在32位系统中,Mark Word为32个比特位,64位系统中,为64个比特位。它是一个多功能的数据区,可以存放对象的哈希值,对象的年龄,锁的指针等信息,一个对象是否占用锁,占用哪个锁,就记录在
理解锁在Java虚拟机中的实现和优化之前,我们需要知道对象头和锁的关系。在Java虚拟机的实现中每个对象都有一个对象头,用于保存对象的系统信息。对象头中有一个称为Mark Word的部分,它是实现锁的关键,在32位系统中,Mark Word为32个比特位,64位系统中,为64个比特位。它是一个多功能的数据区,可以存放对象的哈希值,对象的年龄,锁的指针等信息,一个对象是否占用锁,占用哪个锁,就记录在
好久没有用Java写过东西了,感觉都手生了。最近项目中需要用到rabbitmq作为消息队列,在各个模块和服务之间发送Protobuf类型的消息。这里记录一下简单的接入过程,以及碰到的坑。 RabbitMQ Mac上的简单安装1234brew install rabbitmq#启用RabbitMQ UI management: http://localhost:15672/usr/local/Cel
使用Maven做依赖包管理的时候,经常如下问题:A和B都依赖一个第三方库(分别是V1和V2), 但是V1和V2又是不兼容的,这个时候就很蛋疼了。比如Guava 1.2和1.8就是不兼容的。 这个时候可以用maven-shade-plugin将A或者B打成一个独立的jar包来解决。 maven-shade-plugin 在打包时,可以将项目中依赖的 jar 包中的一些类文件打包到项目构建生成的 ja
场景:对数组进行排序和去重java 8 stream实现12345List<String> list = Arrays.asList("EE", "AA","AA","BB");list.stream() .distinct() .sorted() .forEach(x -> System.out.println(x)); 二叉树实现思路
客户端的leader选举实现由多种选择,最简单的做法是使用zookeeper,例如ZK Curator framework这里我只简单说明一下我在ETCD中实现leader election的做法 每一个client需要启动的时候需要有一个唯一的ID 需要一个目录来保存leader的信息: 例如: /root/path client判断自己是否为leader的时候:12#获取etcd上的lead
让Tomcat支持引用软连接资源默认情况下想通过在Tomcat下建立软连接来使tomcat上的应用引用该资源是不行的,会出现类似错误:12java.lang.IllegalStateException: ContainerBase.addChild: start: LifecycleException: start: : java.io.IOException: Failed to acces
典型的CPU微架构有3级缓存, 每个核都有自己私有的L1, L2缓存. 那么多线程编程时, 另外一个核的线程想要访问当前核内L1, L2 缓存行的数据。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。比如下面的代码:1234567891011121314151
在使用jenkins的时候,写了一个plugin,由于git版本的问题,出现莫名其妙的问题,但是官方的最新版本只有1.7,咋办?只能考虑源码安装了步骤如下 下载编译工具 1yum groupinstall “Development Tools” 下载依赖包 1yum install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openss
查看远程分支加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): 12345678910$ git branch -a master remote tungway v1.52* zrong remotes/origin/master remotes/origin/tungway remotes/origin/v1.52 remotes/origin/zrong 删除远程分支和tag在Git v1.7.0 之后,可以使用这种语法删除远程分支: 1$ git push origin --delete <branchName> 删除tag这么用: 1git push origin --delete tag <tagname>
Java NIO是是jdk1.4里提供的新API, 为所有的原始类型提供缓存支持。几个主要概念: Channels and Buffers: 和标准的基于字节流或者字符流的标准IO API相比,NIO利用Channel和Buffer,数据直接从Channel读去到内存Buffer,或者从Buffer写入Channel, 减少了数据的拷贝。Channel维持了客户端和服务器的链接资源。也可以理解为