Java中的锁
2023-12-14 20:51:20 8 举报
AI智能生成
Java中的锁是一种同步机制,用于控制多个线程对共享资源的访问。它确保在任何时刻只有一个线程能够执行特定的代码块,从而避免了多线程环境下的数据不一致问题。Java提供了多种内置的锁实现,如synchronized关键字、ReentrantLock类等。使用锁时,需要确保在适当的时候释放锁,以避免死锁的发生。此外,Java还提供了一些高级的锁特性,如公平锁、读写锁等,以满足不同场景下的并发需求。总之,Java中的锁是实现线程安全的重要手段,对于编写高性能、可扩展的多线程程序具有重要意义。
作者其他创作
大纲/内容
多线程没有锁就造成数据错乱
锁的是对象,不是锁代码
在同一时刻只有一个线程能够进入锁住的代码
锁空闲的时候就改为上锁状态
已经上锁则返回失败
上锁
将锁的状态改为空闲状态
解锁
锁拥有两种状态(空闲状态、上锁状态)
锁的作用
数据版本机制
CAS操作
乐观锁 | 不会真正上锁,认为修改数据的时候别人不会修改,很乐观
MySQL的锁
sychronized
悲观锁 | 会真正上锁,总是认为修改数据的时候别人会修改,很悲观
乐观锁/悲观锁
ReentrantLock
独享锁 | 只有一个线程能够获取到锁,其他的都会被阻塞。
ReadWriteLock
共享锁 | 可以有多个线程获取到锁
独享锁/共享锁
可重入锁 | 允许同一个线程多次获取同一把锁
不可重入锁 | 不允许同一个线程在持有锁的情况下再次获取该锁,否则会导致死锁
可重入锁/不可重入锁
公平锁 | 按照先来先服务的思想,按照顺序颁发锁
吞吐量比公平锁大
优点
线程饥饿 | 有一个线程一只占着CPU资源,其他线程没有运行的机会
优先级反转 | 低优先级的线程持有锁时,一个高优先级的线程却无法获取该锁
缺点
非公平锁 | 先来的不一定能够拿到锁
公平锁/非公平锁
实现:HashMap的实现原理
分段锁 | 细化锁的粒度
优点:减少线程上下文切换的消耗
缺点:循环会消耗CPU
自旋锁 | 线程获取不到锁会去尝试再次获取
分段锁/自旋锁
锁的种类
加入该关键字的代码有且只有一个线程调用
同步代码块
用在代码块中
普通方法,当前类对象
静态方法,锁住的是整个类
用在方法中
同步锁
不会被其他线程打断
原子性
释放锁资源的时候会将数据写回主内存,解决了线程可见性问题
可见性
ynchronized是一个可重入锁
可重入性
因为synchronized需要依赖于操作系统实现线程切换,因此效率低、开销大
重量级锁
当synchronized遇到异常的时候会自动释放锁资源,不会造成死锁
自动释放
特点
synchronized
Lock是一个接口,特点与synchronized相反
Lock线程是可以打断的,也需要手动释放资源,因此需要使用finally释放锁资源
Lock
锁的实现
屏蔽各种硬件和操作系统的内存访问差异,Java程序在各种平台下都能达到一致的并发效果
存储所有的变量
主内存
每一个线程都有工作内存
每一个线程都会从主内存中copy一份需要的内容到工作内存中
线程对于变量的读写都是在工作内存中,无法影响到主内存
工作内存
Java Memory Model——JMM
将变量更新通知到其他的线程
volatile
刷新变量
加锁
解决办法
Java内存模型
线程可见性
请看Redisson......
分布式锁
Java中的锁
0 条评论
下一页