你知道的Java锁有哪些? synchronized?Lock?它们又有什么区别?锁可分为哪些种类?锁是如何实现的?


公平与非公平锁

公平锁与非公平锁的区别体现在锁造成阻塞时的排队机制,公平锁按申请锁顺序排队等待获取锁,而非公平并不是按照申请顺序,有可能后申请的线程先获取到锁。

常用到的ReentrantLock 在创建的时候可以指定锁机制是公平还是非公平,默认非公平。synchronized也是非公平的

    public ReentrantLock() {sync = new NonfairSync();}public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}

可重入锁

synchronized,ReentrantLock,都是可重入锁,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也就是说线程可以进入任何一个它已经拥有的锁所同步的代码块,即表示可重新反复进入的锁,但仅限于当前线程;

// 线程可以进入任何一个它已经拥有的锁所同步的代码块
public synchronized void method1(){// 访问另一个同步方法,自动获取锁method2();
}public synchronized void method2(){}

Lock锁,可重入示例加几次锁,要记得释放几次

    private ReentrantLock lock = new ReentrantLock();public void method1(){try {lock.lock();// 可重入,可以进入任何一个它已经拥有的锁所同步的代码method2();}finally {lock.unlock();}}public void method2(){try {lock.lock();}finally {lock.unlock();}}

自旋锁

什么是自旋锁,通过名字就可以猜到大概,通过unsafe+volatile自旋(while)的方式来"阻塞代码"

尝试获取锁的线程不会阻塞,而是采用循环的方式去尝试获取锁,这样的好处是可以减少线程上下文切换,缺点就是消耗cpu

// Unsafe 类中的一处自旋锁public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {// 拿到原有的值var5 = this.getIntVolatile(var1, var2);// 尝试进行替换,如果替换成功返回,否则一直尝试} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

自己实现一个自旋锁

// 思考一下这个锁是可重入还是不可重入
public class MyLock {private AtomicReference<Thread> reference = new AtomicReference<>();public void lock(){Thread thread = Thread.currentThread();// 如果当前引用中有thread,那么说明在加锁中,其他线程自旋等待while(!reference.compareAndSet(null,thread)){System.out.println(thread.getName()+"尝试加锁");}}public void unlock(){Thread thread = Thread.currentThread();// 解锁,如果当前线程是自己引用置为nullreference.compareAndSet(thread,null);System.out.println(thread.getName()+"解锁");}
}

独占锁/共享锁/互斥锁

独占锁

指该锁一次只能被一个线程锁持有。对ReentrantLock和Synchronized而言都是独占锁。

共享锁

该锁可以被多个线程持有

读写锁

ReentrantReadWriteLock 其读锁就是共享锁,写锁就是共享锁;读写,写读,写写的过程互斥,互斥锁。

示例:

public class MyData {private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();private volatile Map<String, Object> map = new HashMap<>();public Object get(String key) {// 添加读锁readWriteLock.readLock().lock();Object o = null;try {System.out.println(Thread.currentThread().getName() + "读取");o = map.get(key);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "读取完成");} catch (Exception e) {e.printStackTrace();} finally {readWriteLock.readLock().unlock();}return o;}public void put(String key, Object value) {// 添加写锁readWriteLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName() + "写入");map.put(key, value);try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "写入完成");} catch (Exception e) {e.printStackTrace();} finally {readWriteLock.writeLock().unlock();}}public static void main(String[] args) {MyData m = new MyData();for (int i = 0; i < 10; i++) {final int temp = i;new Thread(() -> {m.put(temp + "", null);}, "writeThread" + i).start();}for (int i = 0; i < 10; i++) {final int temp = i;new Thread(() -> {m.get(temp + "");}, "readThread" + i).start();}}
}
  咸鱼IT技术交流群:89248062,在这里有一群和你一样有爱、有追求、会生活的朋友! 大家在一起互相支持,共同陪伴,让自己每天都活在丰盛和喜乐中!同时还有庞大的小伙伴团体,在你遇到困扰时给予你及时的帮助,让你从自己的坑洞中快速爬出来,元气满满地重新投入到生活中!

Java成神之路——重入锁、公平非公平锁、自旋锁、读写锁相关推荐

  1. Java成神之路技术整理

    转载自 Java成神之路技术整理 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 Java 集合篇 Java 多线程篇 J ...

  2. Java成神之路[转]

    阿里大牛珍藏架构资料,点击链接免费获取 针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 ...

  3. 【学海无涯】Java成神之路

    基础篇 面向对象 面向对象与面向过程   面向过程就是按照程序进行的顺序依次编写索要完成相应任务的方法,依次调用.面型对象注重对逻辑概念的封装,将若干变量和方法封装成类,各个对象互相调用.面向对象占用 ...

  4. Alibaba技术专家倾心五年打造 Java成神之路:基础篇

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是Java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  5. Java成神之路技术整理,本文长期更新!

    原文地址:https://mp.weixin.qq.com/s/N507Cfb_mbkGvHtg_FIaVg(来源:java技术栈微信公众号) 以下是Java技术栈微信公众号发布的所有关于 Java ...

  6. Java成神之路-进阶步骤(转)

    https://www.hollischuang.com/archives/3280 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Jav ...

  7. Java成神之路——volatile是什么?

    volatile 是什么? java虚拟体提供的轻量级同步机制,可以保证内存可见性,不能保证原子性,禁止指令重排序 java内存模型 java memory model.java内存模型一种抽象概念或 ...

  8. Java成神之路——javaAgent(插桩,attach)

    javaAgent Javaagent 是什么? javaAgent运行类加载器在加载类之前对类做出动态的修改. 运行java命令执行时添加参数 -javaagent指定打包好的agent的jar即可 ...

  9. Java成神之路——ASM,Javassist,cglib区别。

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

最新文章

  1. 警惕!银行风控模型或将“摇身一变”,成为风险缔造者
  2. 2020-08-24绘制ROC   PR曲线 核心方法总结 ,计算AUC核心方法
  3. 面试算法:Maxbuild
  4. rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that
  5. Hystrix之外健壮微服务的新选择:Sentinel 发布首个生产版本 1
  6. 《死亡笔记》等书遭禁 北京全市封杀“鬼故事”
  7. 那天有个小孩跟我说LINQ(四)
  8. Node.js学习之(第二章:exports和module.exports)
  9. 旅行商回溯算法C语言,【算法作业】用回溯法求解旅行商问题
  10. git回滚到某个版本操作
  11. DB2存储过程分页测试
  12. 解决Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt的问题
  13. 控制终端, 用户登录、mail、hostname、随机数 (笔记)
  14. python简单代码表白-表白python代码
  15. Windows7下载、安装、配置ADB的步骤
  16. vue3.0 组件篇 Card
  17. 利用 Python 实现简单的基于用户的商品推荐模型
  18. 游戏编辑器制作(7)
  19. vue统一或单独控制接口请求时间
  20. 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想

热门文章

  1. realme Q5系列核心规格曝光:80W快充加持 同价位绝无仅有
  2. 2699!Redmi Note 11潮流限定版再次发售:全球首发“全系悬浮工艺”
  3. 苹果,把充电器还给我们!京沪法学生状告苹果公司欺诈
  4. 小米12系列旗舰最新爆料:内藏5000mAh电池但机身更薄
  5. 英伟达数据中心业务营收不断创下新高,已连续9个财季保持增长
  6. 小米MIX 4屏幕细节曝光:首发柔性曲面屏下前摄
  7. AMD CEO苏姿丰称芯片短缺还将持续 今年相当紧缺
  8. “庆渝年”​又更新了!法院裁定:禁止李国庆接触、骚扰、殴打俞渝
  9. 鸿蒙系统将登陆2亿台华为手机,“别的厂商想用,我们会支持!”
  10. 2020年朋友圈十大谣言:包括蚊蝇可以传播新冠病毒等