java高级编程知识点合集---多线程(二)

(一)CAS(compare and swap)比较交换
        1,CAS是基于冲突检测的乐观锁,CAS包括三个运算符内存地址V、期望的值A、一个新值B。基本思路:如果地址V上的值和期望的值A相等,就给地址V赋给新值B,如果不是,不做任何操作。例如:内存地址V=5,C线程拿到V后做加1运算,突然D线程把V改成了6,C线程CAS操作修改V时发现期望值A=5,V=6不相等又循环重新拿V做加1操作,直至V=A修改成功不然循环(死循环,自旋)里不断的进行CAS操作
        2,CAS存在的问题
               1>ABA问题:线程1拿到数据后,线程将数据修改了,然后又修改回来了。
                2>自旋的时候开销大

(二)synchronized
        1,使用方式:1>修饰方法:获取当前对象的锁
                                2>修饰静态方法:获取当前类的锁,会作用与类的所有对象
                                3>修饰代码块:获取指定加锁对象的锁
        2,synchronized底层实现
                synchronized底层是借助操作系统的互斥锁Mutex Lock实现的,当对象被new出来后会创建一个监视器,线程只有获得监视器才可以获得锁,当线程获得锁后监视器的值会加1,只有重新变回0的时候才可以被其他的线程获得锁。

        3,synchronized可重入的原理
                可重入指的是当线程获取到了这个锁之后还可以再次获取这个锁。synchronized底层维护了一个计数器,每当这个线程获取一次,计数器就会加1,释放一次锁就会减1

        4,synchronized锁升级
                1>1.8之前synchronized是重量级锁。1.8之后synchronized进行的优化,引入了锁的升级(无锁->偏向锁->轻量锁->重量锁)。
                2>对象刚创建出来是无锁状态的,当线程获取锁的时候会先判断mark word的后两位值是不是01,然后判断是否为偏向锁,不是则通过CAS操作将mark word的前23位修改成线程自己的ID,升级为偏向锁
                3>当多个线程获取同一个锁的时候,就会升级为轻量锁。当多个线程过来试图获取锁的时候,首先会判断获取锁的线程ID是否和偏向锁保存的线程ID一致,如果不是就会判断获取到该偏向锁的线程是否存活,如果没有存活就会在安全点替换ID,如果存活,就升级为轻量锁。升级轻量锁会在栈空间中创建一个空间保存拷贝过来的mark word和lock recorde,然后通过CAS操作修改锁记录指针指向lock record升级为轻量锁,没有获得锁的线程开始自旋尝试获取锁
                4>当自旋获取锁的线程长时间获取不到锁的时候,就会升级为重量锁,阻塞自旋线程

(三)AQS
        1,AQS的核心思想是如果共享的资源是空闲的话,就把当前请求资源的线程设置成有限线程,如果非空闲,就将想要获取资源而获取不到的线程放入队列中
         2,以ReentrantLock为例


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ...................................................................面试.................................................................................... 19 2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 ..................................................................................................................................... 21 2.2.1. 程序计数器(线程私有) ................................................................................................................ 22 2.2.2. 虚拟机栈(线程私有) .................................................................................................................... 22 2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................................................................... 23 2.3. JVM 运行时内存 ................................................................................................................................. 24 2.3.1. 新生代 .......................................................................................................................................... 24 2.3.1.1. 2.3.1.2. 2.3.1.3. 2.3.1.4. Eden 区 .................................................................................................................................................... 24 ServivorFrom........................................................................................................................................... 24 ServivorTo ...........................................

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值