sychornized

sychornized的应用:
1、加在方法前面;
我们new的这个对象,这个对象调用这个加了sychornized方法,那么这个对象的锁就被这个方法获取了;(System.out.print()这个方法千万不要在实际应用中写,其底层是单例模式,且是同步代码块可想而知所有的System.out.print()用的都是同一个对象的锁,非常影响性能)
2、加在静态方法前面;
静态方法是加sychornized,作用的是class本身,相当于类锁,这个类的所有加了sychornized的静态方法公用一个类锁,所以当在一个类中写多个sychornized的静态方法一定要慎重,非常影响性能,如果四处被调用就更危险了。但是他们和这个类new出来的对象锁不会有互斥;
3、加在方法内部的同步块;
锁的就是放在括号里面的对象;
在JDK1.6之前sychornized的效率低下,因为sychornized在1.6之前都是直接加重量级锁;锁依赖于对象,这对象会天然的拥有monitor管程对象去管理这些锁,monitor依赖底层操作系统的Mutex互斥量,这个锁就要需要jvm去调用操作系统Pthread库里面的方法(比如阻塞,互斥量);因为我们jvm是在用户空间,操作系统是在内核空间,jvm每次去调用操作系统的方法都要从用户态切换成内核态,效率比较低。所以就造成了sychornized效率低下;
AQS ReentrantLock
因为sychornized效率低下所以有了这么一个锁,其效率比原来的sychornized高的多,和1.6版本及以后的sychornized差不多;(拥有sychornized没有的公平锁特性)
在JDK1.6之后sychornized
在单线程运行的情况下sychornized会是偏量锁,当有两个线程同时访问同步代码的时候就会升级成轻量级锁,轻量级锁不会去阻塞线程,而是在cpu做一定次数的循环(循环过程中会去判断这个锁是否被释放),当做完循环重新进入线程,如果做完循环(在一定范围内还是没有被释放)还是有其他对象抢占着这个锁,这时就会升级成之前的重量级锁,其过程不可逆,当锁升级后就不能再降级了;
对象的内存布局
对象头,实例数据,对齐填充位(8字节的整数倍,最快寻址)
对像头(用32位系统来说,64位的话也会指针压缩成32位)
1、Mark Word
对象的HashCode值,锁状态标志,是否偏向锁,分代年龄,当前获取锁的线程id,Epoch
在这里插入图片描述
偏向锁:线程id(每个线程创建出来都有唯一的id),Epoch
(偏向锁在调用hashcode这个方法时,会升级成轻量级锁,原因不明,可能是因为没有位置存储hashcode的原因导致的)
在线程刚启动的时候会生成的是轻量锁而不是偏向锁,因为JVM启动的时候会默认延迟启动偏向锁,大概4秒,jvm本身就会依赖大量的hashcode,class类和其他对象其中就有大量的同步块,jvm本身就会启动10几个线程,他们内部就存在竞争,为了避免这些无谓的竞争。所以推迟启动偏向锁。
匿名偏向,可偏向状态,当线程中的对象加了sychornized会把线程的id做记录,那么还未引用sychornized时(但是未来会引用sychornized),他的是否偏向锁那一栏就做了标记也是就 01;
升级:两个线程交替执行就会升级成轻量级锁
轻量级锁:其Mark Word存有指向栈中锁记录的指针;
迟迟得不到锁,就会转成重量级锁
重量级锁:其Mark Word存指向互斥量的指针;
2、元数据指针:(指向在元空间的地址,指针压缩):通过这个指针获取class对象,class对象还有指针指向kclass对象
3、数组长度:如果是数组对象就有数组长度

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值