我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java锁怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java锁怎么理解

本篇内容主要讲解“Java锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java锁怎么理解”吧!

自旋?

Java锁怎么理解

Java锁怎么理解

自旋锁

如果此时拿不到锁,它不马上进入阻塞状态,而愿意等待一段时间。

如果循环一定的次数还拿不到锁,那么它才会进入阻塞的状态,循环的次数是可以人为指定的。

  •  自旋锁?

有一天去全家买咖啡,服务员说真不巧,前面咖啡机坏了,现在正在修,要等10分钟喔,恰好没什么急事,那就等吧,坐到一边休息区等10分钟(其它什么事都没做)。介就是自旋锁~(自己空转一会儿)

觉得有点浪费时间?如果你等了15分钟,还没修好,那你可能不愿意继续等下去了(15分钟就是设定的自旋等待的最大时间)

Java锁怎么理解

Java锁怎么理解

上面说自旋锁循环的次数是人为指定的,而自适应旋转锁,就厉害了,它不需要人为指定循环次数,它自己本身会判断要循环几次,而且每个线程可能循环的次数也是不一样的。

如果这个线程之前拿到过锁,或者经常拿到一个锁,那它自己判断下来再次拿到这个锁的概率很大,循环次数就大一些;如果这个线程之前没拿到过这个锁,那它就没把握了,怕消耗CPU,循环次数就小一点。

它解决的是“锁竞争时间不确定”的问题,但也不一定它自己设定的一定合适。

  •  自适应旋转锁?

还是前面去全家等咖啡的栗子吧~ 要是等到5分钟,还没修好,你目测10分钟里也修不好,就不再等下去了(循环次数小);

要是等了10分钟了,服务员说非常抱歉,快了快了,再1分钟就可以用了,你也还不急,都已经等了10分钟了,就多等一会儿嘛(循环次数大)。

Java锁怎么理解

Java锁怎么理解

这个是自旋锁的简单代码实现:

public class SpinLock {      private AtomicReference<Thread> cas = new AtomicReference<Thread>();      public void lock() {          Thread current = Thread.currentThread();          // 利用CAS          while (!cas.compareAndSet(null, current)) {              // DO nothing          }      }      public void unlock() {          Thread current = Thread.currentThread();          cas.compareAndSet(current, null);      }  }

稍微分析下~

  •  lock()方法利用CAS,当第一个线程A获取锁的时候,能够成功获取到,不会进入while循环;

  •  如果此时线程A没有释放锁,另一个线程B又来获取锁,此时由于不满足CAS,所以就会进入while循环;

  •  然后线程B会不断判断是否满足CAS,直到A线程调用unlock方法释放了该锁,它才能获取锁。   

Java锁怎么理解

Java锁怎么理解

  • 主要存在以下问题:

  1.  如果某个线程持有锁的时间过长,就会导致其它等待获取锁的线程进入循环等待,消耗CPU。使用不当会造成CPU使用率极高。

  2.  本身无法保证公平性,即无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在“线程饥饿”问题。

  3.  无法保证可重入性。基于自旋锁,可以实现具备公平性和可重入性质的锁。

后面这几个以后有空再详细来说~

自旋锁 Vs 阻塞锁

Java锁怎么理解

Java锁怎么理解

  •  阻塞的栗子~

去一个热门饭店吃饭,到了门口一看,门口的座位坐满了人&hellip;&hellip;这咋整&hellip;&hellip;服务员说,您可以先拿个号~小票上扫个二维码,关注咱们,轮到您了,服务号里就会有提示哒~(很熟悉是不是?)

然后你就先取了号去逛逛周围小店去了,等轮到你了,手机里收到一条服务提醒消息,到你啦~这时你再去,就可以进店了。

这就是阻塞的过程~

那自旋呢?

就是你自己其它事情都不做,等在那里,就像去超市排队结账一样,你走开的话是没有人会通知你的,只能重新排队,需要自己时刻检查有没有排到(能不能访问到共享资源)。

这里插播一下:

阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。

来看看自旋和阻塞的比较~

Java锁怎么理解

Java锁怎么理解

Java锁怎么理解

Java锁怎么理解

只升不降的锁状态

锁主要存在四种状态:“无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态”。

其实这四种状态都不是Java语言中的锁,而是Jvm为了提高锁的获取与释放效率而做的优化(使用synchronized时)。

它们会随着竞争的激烈而逐渐升级,并且是不可逆的升级。

升级过程是这样的:

  •  偏向锁 -> 轻量级锁 -> 重量级锁

Java锁怎么理解

Java锁怎么理解

关于无锁~

如果一个方法本来就不涉及共享数据,那它自然就无须任何同步措施去保证正确性,因此会有一些代码天生就是线程安全的。

它没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。

CAS算法 即compare and swap(比较与交换),就是有名的无锁算法。

Java锁怎么理解

Java锁怎么理解

Java锁怎么理解

Java锁怎么理解

Java锁怎么理解

状态还是详细比较下吧~

Java锁怎么理解

  •  知道你想要栗子

你经常去一家店坐在同一个位置吃饭,老板已经记住你啦,每次你去的时候,只要店里客人不多,老板都会给你留着那个座位,这个座位就是你的“偏向锁”,每次只有你这一个线程用。

有一天你去的时候,店里已经坐满了,你的位置也被别人坐了,你只能等着(进入竞争状态),这时那个座位就升级到“轻量级锁”了。

要是那个座位特别好(临窗风景最佳,能隔江赏月~)每次你到的时候,都有其他好几个人也要去抢那个位置,没坐到那个位置就不吃饭了>_< 那时那个座位就升级到“重量级锁”了。

是不是好理解啦?

共享 or 独享?

Java锁怎么理解

还是专业地讲下概念~(手机上请点击图片放大看看~)

Java锁怎么理解

Java锁怎么理解 

Java锁怎么理解

Java锁怎么理解

  • 还有栗子~

每个礼拜小组的各个成员要共同填一份周报表格,

要是每个人打开的时候,可以加一个写锁,即你在写的时候,别人不能修改,这就是独享锁(写锁);

但是这份表格大家可以同时打开,看到表格内容(读取数据),正在改数据的人可以对这份表格加上共享锁,那这个锁就是共享锁。

到此,相信大家对“Java锁怎么理解”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java锁怎么理解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java锁怎么理解

本篇内容主要讲解“Java锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java锁怎么理解”吧!自旋?自旋锁如果此时拿不到锁,它不马上进入阻塞状态,而愿意等待一段时间。如果循环一定的次
2023-06-16

怎么理解Java悲观锁与乐观锁

本篇内容介绍了“怎么理解Java悲观锁与乐观锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1锁(Lock)在介绍悲观锁和乐观锁之前,让我们
2023-06-04

Java幂等性与分布式锁怎么理解

本篇内容主要讲解“Java幂等性与分布式锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java幂等性与分布式锁怎么理解”吧!1. 什么是幂等性幂等性就是指:一个幂等操作任其执行多次所
2023-06-05

Java死锁问题怎么解决

今天小编给大家分享一下Java死锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:死锁(Dead Lock)
2023-06-30

Oracle中的死锁怎么理解

本篇内容主要讲解“Oracle中的死锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle中的死锁怎么理解”吧!死锁Dead Lock 我们大家最早接触死锁这个概念可能是在操作系统
2023-06-06

mysql锁表怎么解锁

要解锁 mysql 中锁定的表,请执行以下步骤:确定锁定的表:使用 show processlist 命令。杀掉锁定线程:使用 kill 命令。使用 unlock tables 语句:使用 unlock tables 语句解锁所有锁定的表
mysql锁表怎么解锁
2024-05-30

深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

synchronized 和 Reentrantlock多线程编程中,当代码需要同步时我们会用到锁。Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式。显式锁是JDK1.5引入的,这两种
2023-05-30

Java锁怎么使用

这篇文章主要介绍了Java锁怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java锁怎么使用文章都会有所收获,下面我们一起来看看吧。乐观锁和悲观锁悲观锁悲观锁对应于生活中悲观的人,悲观的人总是想着事情往
2023-07-02

怎么理解iOS开发中的锁

本篇内容介绍了“怎么理解iOS开发中的锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!OSSpinLock上述文章中已经介绍了 OSSpin
2023-06-04

怎么理解synchronized与锁的关系

这篇文章主要讲解了“怎么理解synchronized与锁的关系”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解synchronized与锁的关系”吧!JVM 是如何实现 synchro
2023-06-16

oracle锁表后怎么解锁

oracle解锁表的方式:1. 直接连接数据库执行unlock table语句;2. 使用ora_unlock_table函数;3. 查找并关闭持有锁的进程;4. 重启数据库服务器或使用oracle enterprise manager工具
oracle锁表后怎么解锁
2024-05-21

深入理解Java反射,解锁Java编程新境界

Java反射机制是Java编程语言中一项强大的功能,它允许程序在运行时检查和修改类、方法和字段。通过反射,我们可以动态地获取类信息、创建和调用对象、修改字段值等,这为Java编程提供了极大的灵活性。
深入理解Java反射,解锁Java编程新境界
2024-02-02

Java中怎么锁文件

本篇内容主要讲解“Java中怎么锁文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中怎么锁文件”吧!1. 概览当读写文件时,需要确保有适当的文件锁定机制,来保证基于并发I/O应用程序的
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录