您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

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为例


 


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进