Atomic类和线程同步新机制

第三节:Atomic类和线程同步新机制

一、atomic类

  • 说明:
    1. 此类中的所有类型都使用了CAS自旋锁,达到原子性
    2. 属于一种无锁优化,因此要比synchronized锁要轻
  • 对Long数据进行递增的三种方式
    1. synchronized+volatie
    2. AtomicLong
    3. LongAdder
    4. 以上三种从上自下,效率越高
  • 为什么Atomic要比synchronized快?
    • 因为Atomic其底层使用的无锁CAS,轻量级锁进行原子性操作;而synchronized会进行锁升级,当某种情况会向操作系统申请重量级锁,所以有时候Atomic要比synchronized的效率高
  • 为什么LongAdder要比Atomic的效率高?(有待后续继续代码求证)
    • 因为LongAdder中使用的分段锁
    • 它会将所有线程平均分布在一个数组中
    • 每个数组元素都会有需要递增的那个变量
    • 每个元素中的线程对其进行递增完毕后
    • 它会将每个元素中递增完毕的变量值进行求sum

二、基于CAS的几种新类型锁

  1. ReentrantLock
    1. 特点:

      • 可重入

      • 默认非公平锁,可以指定为公平锁

    2. 可替换synchronized锁

      • 在需要加锁的逻辑前加锁lock.lock()
      • 但必须在try…finally中进行手动解锁lock.unlock()
    3. ReentrantLock和synchronized

      1. ReentrantLock和synchronized都是可重入锁
      2. synchronized解锁会由jvm进行解锁
      3. ReentrantLock解锁必须手动解锁,否则会造成死锁
    4. 为什么ReentrantLock和synchronized差不多,还需要ReentrantLock

      1. 因为ReentrantLock中的功能要比synchronized多
    5. ReentrantLock常见方法:

      1. tryLock():进行尝试加锁,会返回一个布尔值,但不管锁定与否,方法都会被执行;synchronized抢到不到,就会进行阻塞
      2. lockInterruptibly:后续自己去学习下
  2. CountDownLatch
    1. 解释:CountDown:倒数,Latch:门闩(倒数的一个门闩5,4,3,2,1,0数到了,这个门闩就会被打开)
    2. latch.countDown():每条线程完成逻辑后,操作此方法,对门闩进行减一;
    3. latch.wait():每条线程线程执行完自己的逻辑后并操作完latch.countDown,会被阻塞在latch.wait中,直至latch.countDown初始化的门闩数减至0,latch.wait才会放开,线程才会结束;
  3. Cyclicbarrier
    1. 解释:循环栅栏,这有个栅栏,什么时候人满了就把栅栏推到,哗啦哗啦的都放出去,出去之后栅栏又重新关起来,满了,再放以此循环
    2. 主要方法:
      1. new Cyclicbarrier(20)或者new Cyclicbarrier(20,()->{sout(“满人”);}),两个new都是设置了满20人才会放开,第二个参数为放开后需要执行的逻辑,没有则就是不做任何处理
      2. barrier.await()方法:线程等待,直到满指定数量后,才会放开
  4. Phaser
    1. 解释:结合了CountDownLatch和Cyclicbarrier的一个名叫阶段,分阶段的栅栏
    2. 按照不同的节点来对线程进行执行,每个阶段不同的时候这个线程都可以往前走,有的线程走到某个阶段就停了,有的线程一直会走到结束
  5. ReadWriteLock
    1. 读写锁:共享锁和排他锁,读锁是共享锁,写锁是排他锁
    2. ReentrantReadWriteLock是ReadWriteLock的一个实现类
    3. 作用:
      1. 对读操作的效率提升
  6. 以后还写不写synchronized?分布式锁咋实现?
    1. 多数情况使用synchronized
    2. 特别追求效率,再去使用其他新锁
    3. 分布式锁:redis分布式锁(两种方式,redis是单线程的),zookeeper分布式锁,数据库分布锁(效率较低)
  7. Semaphore
    1. 解释:信号灯,含义限流,有几个信号灯,就允许几个线程通过
    2. 常见方法:
      1. acquire():阻塞方法,每个线程去acquire(得到)一个信号灯,则可以通过,得不到则阻塞
      2. release():释放方法,得到信号灯的线程,执行完,进行释放信号灯
    3. 作用:
      1. 可以起到限流作用,多个请求进来,只有拿到信号灯的请求才能进入,没有拿到的就会阻塞
    4. 特点:
      1. 默认非公平锁
      2. 有参构造可以改成公平锁
  8. Exchanger
    1. 解释:交换器,两人之间互相交换个数据用的
    2. 场景:
      1. 只能在两个线程之间,进行交换,只需要互相操作Exchanger对象中的exchange(交换的参数)方法进行交换
  9. AQS
    1. 基于CAS的几种新类型锁使用的都是同一个队列,同一个类来实现的,这个类叫AQS
  10. </
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值