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访问标志

posted @   antidogmatist  阅读(23)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示