并发安全性之Lock锁及原理分析

并发安全性之Lock锁及原理分析

个人学习笔记总结


前言

锁是用来解决线程安全的,在此简单介绍J.U.C并发包下Lock的相关应用及原理分析。

一、Lock 与synchronized的区别

Lock是接口,它的实现类实现了手动操作锁的获取与释放,而synchronized是关键字,自动操作锁,性能上相差不大,synchronized相较与lock使用的更多,这里就不再叙述。

二、ReentrantLock

1.ReentrantLock的基本使用

Lock lock = new ReentrantLock();
lock.lock()//抢占锁
lock.unlock()//释放锁
lock.lockInterruptibly()//抢占锁,可中断
boolean flag = lock.tryLock()//抢占锁,没抢占到不阻塞,根据应用场景使用

代码如下(示例):
在这里插入图片描述

2.ReentrantLock实现原理

满足线程的互斥特性,意味着同一时刻,只允一个线程进入到加锁的代码中(多线程环境下,线程的顺序访问)。

三、锁的设计猜想

  • 一定会涉及到锁的抢占,需要一个标记来实现互斥。全局变量(0,1)。

  • 抢占到锁如何处理(无需额外处理)

  • 没抢占的锁如何处理

  • 需要等待(让处于排队中的线程,没抢占到线程,先阻塞释放cpu资源)
    如何让线程等待?
    wait/notify(线程通信的机制,无法唤醒一个指定的线程)
    LockSupport.park/unpark(阻塞一个指定的线程,唤醒一个指定的线程)
    Condition

  • 需要排队(允许有n个线程被阻塞,通过数据结构,把n个排队的线程存储起来)

  • 抢占到锁的释放过程如何处理

    LockSupport.unpark()唤醒处于队列中的指定线程

  • 锁抢占的公平性(是否允许插队)
    公平
    非公平


总结

以上就是今天的内容,本文仅仅简单介绍了ReenTrantLock的使用,以及锁的设计思想。

部分引用自 咕泡学院

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒醒代码出bug了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值