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