Java并发,synchronized,ReentrentLock
Synchronized
JDK1.4之前
重型锁:mutex,需要进入内核
自旋锁spinlock:cas+死循环,(原子指令)不用进内核,消耗cpu
伪代码:
void lock() {
while(!cas(state, 0, 1));
持有者 = 当前线程;
}
void unlock() {
if (持有者 == 当前线程) {
持有者 = null;
state = 0;
}
}
JDK1.4
自选锁 + 重型锁:先自旋n次,如果循环多次都不行,就用重型锁,充分结合二者的优点。
JDK1.6
自适应自旋:程序自己学习n的取值
无锁
偏向锁
轻量锁
重量级锁
Synchronized和Lock的区别
- 关键字,接口
- 隐式,显示
- 方法+代码块,代码块
- 底层原理:synchronized采用对象的监视器,Lock采用AQS
- 加锁方式:超时加锁,可中断获取锁
- synchronized只有一个同步队列和等待队列,lock有一个同步队列但有多个等待队列
- 锁竞争:synchronized只支持非公平锁,lock都支持
- 等待唤醒机制:wait(),notify(); Conditon接口,await,signal
- 个性化定制:AQS用的是模板方法模式,可以自定义,ReadWriteLock
Lock接口里面有什么方法?
- lock():加锁
- unlock(): 解锁
- tryLock(): 非阻塞加锁
- tryLock(time)
- lockInterrupt(): 可中断加锁
- Condition:通知机制
实现类
ReentrentLock,
synchronized加在普通方法上和静态方法上有什么区别
synchronized加载方法上和代码块上进行反编译成字节码后有什么区别
代码块:
moniterenter
moniterexit正常出口
moniterexit异常出口(编译层加的,防止Runtime类型的异常)
方法:
在方法的flag里加一个ACC_SYNCHRONIZED访问标志
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?