java对象底层实现-创新互联
一个java对象信息由以下几个部分组成
成都创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元庆云做网站,已为上家服务,为庆云各地企业和个人服务,联系电话:18980820575markword | 记录着锁状态,GC息,hashCode |
klass pointer | |
m | |
padding |
package cn.sensorsdata.exercise.MultiThread;
import org.openjdk.jol.info.ClassLayout;
public class HelloJOL {
public static void main(String[] args) {
Object object = new Object();
System.out.println(ClassLayout.parseInstance(object).toPrintable());
}
}
1 当代码为上面写法时,执行的java对象模型为下面结果
2 当代码为下面的时,给对象加锁则,对象模型为下面的
package cn.sensorsdata.exercise.MultiThread;
import org.openjdk.jol.info.ClassLayout;
public class HelloJOL {
public static void main(String[] args) {
Object object = new Object();
System.out.println(ClassLayout.parseInstance(object).toPrintable());
synchronized (object){
System.out.println(ClassLayout.parseInstance(object).toPrintable());
}
}
}
加锁后执行的结果为:
hotspot的内部实现: 在java对象模型里有个markword 记录着锁信息(无锁态,偏向锁,轻量锁,重量锁,以及GC的信息,以及hashcode。
概念普及:用户态与内核态
JDK早期:synchronized叫做重量级锁,因为申请锁资源必须通过kernel,系统调用操作系统,像轻量级别锁cas就是在业务处理上实现不用加锁也可以进行对象一致性保证。
无锁态->偏向锁->轻量锁(自旋锁\无锁)->重量级锁
无锁态:比如刚new 出来的对象
偏向锁: 为何会有偏向锁?多数sychronized方法,在很多情况下,只有一个线程在运行,
例如:StringBuffer中的一些sync方法,Vector中的一些方法
轻量级别锁:假如后面又有好几个线程要写,则从自旋锁升级到轻量级锁,在这个过程中,操作系统会优先给之前的线程分配锁,后面的线程不断轮询查看对象锁的状态,当锁被释放的时候就抢到锁。
重量级别锁:有线程超过十次 或者有多个线程在等待,超过线程的1/2 就升级重量锁(以前的jvm优化可以调整锁参数,现在jvm会自己做优化,自适应锁)
问题:有了轻量级别锁为什么还有重量级别锁,主要是轻量级别锁,对于那种线程执行快的情况下可以给其他线程分配到执行的资源(占用cpu资源). 如果某个线程占用时间长则这种策略会出现问题。
重量级别锁,有个队列,等待队列,将暂时排列不到的线程放到线程里面.
偏向锁升级轻量锁:只要有另一个线程访问对象就会升级轻量锁
轻量锁升级重量锁: 申请10圈都等不到锁,或者超过线程数的1/2则升级重量锁
锁升级同步
对于锁,是操作系统的内部机制,对于某一块内存,加锁进行访问控制。
偏向锁不一定比自旋锁、轻量锁效率高。例如,业务里面有多个线程进行锁获取,这个时候就不用偏向锁,直接升级轻量锁。偏向锁还要进行锁销毁耗费时间.
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享标题:java对象底层实现-创新互联
地址分享:http://cdiso.cn/article/hsihd.html