开始说
分布式和多线程很重要,哈哈。至于多线程开发这一块儿,应用自己没任何问题 可是问到了底层的技术实现,当时尬了。故将自己这两天对同步锁的底层实现方式进行一下探秘。
javap 命令
这是我的是linux桌面系统 ubuntu 16.04
直接上命令
当然这里不得不提一下java命令与javac 命令
javac 用来编译咱们写的xxx.java 文件 java 用来执行javac 编译后的 xxx.class
以上是 javap 所有的option
本次我们用到的是-c 也就是要反编译我的代码 哈哈 这是一种非常有效的方式 看看平时写的代码被反编译后的样子吧!
伪代码如下
public classInstance {
protected voidtest(){
//同步代码块
synchronized(this) {
doSomething();
}
}
private voiddoSomething(){
// write your service
}
}
以上代码被反编译后:
我顶定义 test() 中定义的同步代码块 反编译后 出现了monitor 分别有个enter 与 exit
当前线程进来时有个标志 出去时去掉标志 这个标志唯一,谁有这个标志代表谁获得了进入权限
继续挖掘
第一个 aload_0 装载第一个引用的对象
第二个 aload_0 守护monitor 进入montior 时 montior进入数为1,其他线程只能等待知道进入数为0
goto 正常完成了这个方法
第二个monitorexit 为了确保当前线程离开monitor
小结
结合操作系统的知识,synchonized机制与线程锁的实现原理都是一样的,底层都是通过类似于montiorLock的实现方式。
当然强大的Lock 的掌握以及网络IO 的掌握将更有利于我们开发或者阅读java中间件。