java锁相关理解《云课堂》

4 篇文章 0 订阅

1. JAVA中锁的概念

自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断锁是否能被成功获取,直到获取锁才会退出循环(cas)。
乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改(如cas(0,1)先比较正确就交换失败就自旋)
悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁(syschronized就是悲观锁如public syschronized void ss(){})
独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写就是互斥锁)
共享锁(读):给资源加上读锁后不能只能读不能改,其他线程只能加读锁,不能加写锁;(多读起限流的作用,类比于景点,只能一万人同时观看)
可重入锁、不可重入锁:线程拿到一把锁之后,可以自由进入同一把锁同步其他代码(ReentrantLock syschronized场景针对于递归抢锁)。
公平锁,非公平锁:争抢锁的顺序,如果是按先来后到,则为公平(获取不到锁的时候,会自动加入队列,等待线程释放锁后所有等待的线程同时去竞争 为非公平,获取不到锁的时候,会自动加入队列,等待线程释放后,队列的第一个线程获取锁为非公平)

2. 同步关键字synchronized

1、用于实例方法、静态方法时,隐藏指定锁对象
2、用于代码块时,显示指定锁对象
3、锁的作用域:对象锁、类锁、分布式锁
4、引申:如果是多个进程,怎么办?
特性:可重入、独享、悲观锁、非公平锁
锁优化:锁消除( jit编译器进行锁消除就是去掉关键字synchronuzed而条件是这个是个但单线程且执行很多次才会触发jit这个机制) 所粗化j(dk做了锁粗化的优化,但我们自己可以从代码层面 优化把多个锁的操作移动到同一个锁如synchronuzed(this))
synchronized关键字,不仅实现同步,jmm中规定,synchronized要保证可见性(不能够被缓存)

3.java对象在内存中的布局

在这里插入图片描述
mark word的图:
在这里插入图片描述
如上图所示堆存放的是实例变量,局部变量存在栈中,方法和类信息存在方法区中,堆存储对象的状态 如string 局部变量表str指向堆对象的地址,堆对象没有值为abc 堆对象指向常量池abc对象头除了有一个指向方法区类对象以外,还有数组长度(当对对象有数组时候) 还有mark word(都是内存区域32-(32位机器)-64(64机器))

4.思考一下??

锁住this对象
synchronized(this){
i++;
}
加锁的状态如何记录:
加锁是状态是通过对象的头部中一个mark word的值改变记录的,其通过cas的自旋操作做到的改变虚拟机栈里面的值。
状态会被记录到this对象中吗?

若锁占用,线程挂起,释放锁时,唤醒的线程,是如何做到的?
加锁(是线程要加锁) 能代表线程的是虚拟机栈(执行方法的数据结构)

5.锁的升级

在这里插入图片描述
偏向锁:
在这里插入图片描述
存在一个开启偏向锁的问题 未开启就到轻量级锁 cas(0,线程id) 偏向锁优点只有一个线程使用的时候根本不解锁 其thread ID 不变 省略cas操作减少性能损耗 (当达到某个条件会可能很久没用会解锁)当第二个线程来的时候其threadId不同升级为轻量级锁(锁只有升级没有降级) 当自旋次数达到一定次数或在来个t3线程的时候就会升级成重量级锁
轻量级锁:
在这里插入图片描述
如图所示先取出2个线程堆中对象的头部mark word的值通过cas插入虚拟机栈,当一个提前插入的时候起当前值已经改变t2只能自旋一直处于runnable (次数达到变成重量级锁) 当2个线程一个已经改掉了,在加上图线程无意义因为其当前值markwork已经无意义 出现一个t3线程锁升级(重量级锁会在每一个对象都有一个对象监视器
ower记录的是当前对象锁是被谁获取)
在这里插入图片描述
如图:wait将他释放锁到waitset中去 t2 线程唤醒t1 t2当前占有锁,t1只能到entryList等待没抢到锁
说明:Object的wait()挂起线程将锁释放 、notify()将线程唤醒、notifyall()只能和synchronized配合使用可以唤醒一个或多个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值