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