本文最后更新于335 天前,其中的信息可能已经过时,如有错误请发送邮件到3368129372@qq.com
syncronized与lock的区别
都是Java中用去解决线程安全问题的工具,是Java实现线程同步的方式。
- 身份:synchronized是Java内置关键字;Lock是个Java提供的一个接口,
- 释放角色:synchronized锁的释放是由JVM来决定的(异常或者运行完成);Lock可由开发者手动释放(建议释放锁放在finally,确保一定被释放)
- 锁粒度:synchronized锁住的是对象,而lock锁住的是代码块。即synchronized.只允许同一时间有目只有一个线程访问被修饰的方法或代码块;Lock可以针对不同的代码块分别加锁,允许多线程同时访问不同的代码块。
- 公平锁:synchronized.不支持公平锁,Lock支持公平锁。公平锁意味着等待时间最长的线程获得锁,避免"饥饿"问题的出现。
- 等待中断:synchronized修饰的方法或者代码块是不允许被中断的;Lock接口则提供了中断等待锁线程的方法,如newCondition()方法
gpt回答:
以及
可重入锁
lock.lock()加锁;
加锁后改变锁的所属人
加锁后内部status(默认为0)+1;
每次加锁时判断是否有人加过锁,加过锁的话是不是自己加的(锁的所属人是否是自己),是自己加的话,status再次+1; - 公平锁:先来的先获取锁,可使用park()与unpark()方法实现。
- 非公平锁: 随机抢,使用cas。
对于公平锁来说,每次加锁前还要判断有没有人来排队