java跨年_2021年跨年阵容出来了,小编也带来新年福利“Java”

2021年跨年阵容出来了,小编也带来新年福利“Java”,不知道你就要落伍啦。56d0caaa2a1919fe0d88532ddd7be446.png

文末有惊喜,一定看完哦,小编准备的新年礼物。

1、为什么要用锁?

锁-是为了解决并发操作引起的脏读、数据不一致的问题。2、锁实现的基本原理

2.1、volatile

Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。

volatile在多处理器开发中保证了共享变量的“ 可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。3ad29c42603bdecbd8687495dbd46785.png

结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

2.2、synchronizedsynchronized通过锁机制实现同步。

先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。

具体表现为以下3种形式。对于普通同步方法,锁是当前实例对象。

对于静态同步方法,锁是当前类的Class对象。

对于同步方法块,锁是Synchonized括号里配置的对象。

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。8399b53bced1b46f82685c1714cbe70c.png

synchronized是基于Monitor来实现同步的。

Monitor从两个方面来支持线程之间的同步:互斥执行

协作

1、Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行。

2、使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。

3、Class和Object都关联了一个Monitor

Monitor 的工作机理线程进入同步方法中。

为了继续执行临界区代码,线程必须获取 Monitor 锁。如果获取锁成功,将成为该监视者对象的拥有者。任一时刻内,监视者对象只属于一个活动线程(The Owner)

拥有监视者对象的线程可以调用 wait() 进入等待集合(Wait Set),同时释放监视锁,进入等待状态。

其他线程调用 notify() / notifyAll() 接口唤醒等待集合中的线程,这些等待的线程需要重新获取监视锁后才能执行 wait() 之后的代码。

同步方法执行完毕了,线程退出临界区,并释放监视锁。

偏向锁:

无锁竞争的情况下为了减少锁竞争的资源开销,引入偏向锁。8c175e87ac58a38c23f1ab65a9cc8491.png

轻量级锁

轻量级锁所适应的场景是线程交替执行同步块的情况。975bf7cea6fb789e202943be354c7b47.png

8f313a43e163de4416aa6237a87aaf8e.png

d9930b491015385e0f82d4e5a3b45221.png

c37b912f9fad8ab54da47a89c6f7c226.png

2021年马上来临,UP主给大家准备了新年礼物Java系列上述视频+源码,需要的小伙伴点赞+评论,私信“资料”无偿获取哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值