22.无阻塞方式获取锁操作
非阻塞式获取锁
引言
本节介绍一个和lock锁相关的知识点,非阻塞式获取锁。有非阻塞式就有阻塞式,下面通过两个动画来帮助我们理解他们的意思,以上厕锁为例,
我们先来看阻塞式上厕锁,一群人排着队,依次等待上厕锁。换成线程来说的话,就是一群线程排着队获取锁,只要是等待,那就是阻塞。线程阻塞锁的就是线程在等待获取锁。
再来看看非阻塞式上厕锁,上厕锁时发现有人,不等待先去别处逛逛,或者先干点别的事。
如果将其换成线程来说的话,就是线程发现锁已经被其他线程获取了,此时不等锁释放先去处理其他任务,这就是非阻塞式不等待
演示阻塞式
下面我们将分别演示阻塞式非阻塞式获取锁。首先来看阻塞式获取锁,以synchronize的为例,在同步代码块中使当前线程睡眠一秒钟,一秒钟之后输出当前线程名称,
用两个线程去执行该任务集中,必定有一个线程获取锁,还有一个线程阻塞,
从执行结果来看,两次输出线程名称前后间隔一秒钟,说明有线程的确被阻塞。
下面来看一下lock锁阻塞式的例子,使用lock方法获取锁,unlock方法释放锁,将同步代码写在它们中间,这里就不再演示执行结果了
因为结果和刚刚的一样
非阻塞式获取锁
接下来看看非阻塞式获取锁是怎样的,lock锁的trylock方法的作用,就是非阻塞式获取锁。该方法返回一个布尔类型的结果,如果锁可用返回true,否则返回false。
下面讲解一下非阻塞式获取锁的书写格式。首先是使用if语句判断trylock返回结果,返回处说明锁可用,无需再调用lock方法获取锁,将同步代码写在try代码块中,将释放锁代码写在finally代码块中,返回false说明锁不可用,将其他代码写在else语句中,以上就是非阻塞式获取锁完整的书写格式。
按照刚刚的格式来演示非阻塞式获取锁,自定义一个任务,在任务中定义一把锁,使用trylock获取锁判断其返回结果,在if语句中写上try finally代码块,在finally代码块中释放锁将需要同步的内容写在try代码块中。
例如这里将当前线程休眠一秒钟,一秒钟之后输出当前线程名称,当锁不可用时执行其他任务,例如说出一句话,
执行任务的demo还是沿用之前的,这里不再重复写。
下面来看看执行结果怎么样,
从执行结果来看,两个线程其中一个线程获取到了锁,另外一个线程没有拿到锁,但是他也没有等待锁,转而去执行了其他任务,没有造成线程阻塞。
Trylock还有一个重载方法,也适用于非阻塞式获取锁,只不过它可以定时什么意思?就是在指定时间范围内,尝试获取锁。如果在指定时间内锁可用,方法返回true,超时则返回false,它有两个参数,分别是等待锁的最长时间time和指定时间单位的unit,该方法返回一个布尔类型的结果,在指定时间内锁可用
返回true,否则返回false。在等待锁的过程中,当线程被中断时,还会引发线程中断异常。
下面我们将使用trylock的重载方法来替代trylock方法,三秒钟之内探索可不可用,使用try---catch方法抛出的异常。
下面来看看执行结果,从执行结果来看,
第一个线程使用锁不到三秒钟就释放了,第二个线程由于三秒钟之内拿到锁,于是他就拿着锁完成了同步任务。
总结
最后来总结一下本节的内容。本节介绍了lock锁的两个非阻塞式获取锁的方法,这两个方法的作用在这里就不再赘述了,在实际开发中这两个方法经常被使用。
附录:
笔记完整文本:
本节介绍一个和looks相关的知识点,非阻塞式获取锁由非阻塞式就有阻塞式,下面通过两个动画来帮助我们理解他们的意思,以上厕锁为例,我们先来看左侧是上厕锁,一群人排着队,依次等待上厕锁。换成县城来说的话,就是一群县城排着队获取锁,只要是等待,那就是阻塞。线程阻塞说的就是县城在等待或缺乏。再来看看非组设施上厕锁,上厕锁时发现有人不等待先去别处逛逛,或者先干点别的事。 如果将其换成线程耐熟的话,就是线程发现锁已经被其他线程获取了,此时不等左释放先去处理其他任务,这就是非阻塞式。不等待下面我们将分别演示阻塞式非阻塞式或切数。首先来看主色是活曲锁,以synchronize的为例,在同步代码块中使当前线程睡眠一秒钟,一秒钟之后输出当前线程名称,用两个线程去执行该任务集中,必定有一个线程获取数,还有一个线程阻塞,从执行结果来看,两次输出县城名称前后间隔一秒钟,说明有县城的确被阻塞。下面来看一下look锁左侧时的例子,使用look方法获取数,按note方法释放,锁将同步代码写在它们中间,这里就不再演示执行结果了,因为结果和刚刚的一样,接下来看看非阻塞式获取锁是怎样的,洛克索的创业logo方法的作用就是非阻塞式获取锁该方法返回一个布尔类型的结果,如果锁可用返回处,否则返回false。 下面讲解一下非组测试获取锁的书写格式。昨天是使用if语句判断try lock返回结果,返回处说明锁可用,无需再调用look方法获取数,将同步代码写在try代码块中,将释放锁代码,携带finally代码快中,返回4th说明锁不可用将其他代码写在as语句中以上,就是非组算式获取锁完整的书写格式。按照刚刚的格式来延迟非阻塞式获取锁自定义一个任务,在任务中定义一把锁使用track获取锁判断其返回结果,在if语句中写上try finally单板块,在finally代码块中释放塑胶需要,同步的内容写在try代码块中。 例如这里将当前线程休眠一秒钟,一秒钟之后输出当前线程名称,当锁不可用时执行其他任务,例如说出一句话,执行任务的demo还是沿用之前的,这里不再重复写。下面来看看执行结果怎么样,从执行结果来看,两个线程其中一个线程获取到了数,另外一个县城没有拿到锁,但是他也没有等待说转而去执行了其他任务,没有造成线程阻塞。Try look还有一个重载方法,也适用于非阻塞式获取数,只不过它可以定时什么意思?就是在指定时间范围内,常识活期锁如果在指定时间内锁可用方法反馈出超时则返回forth,它有两个参数,分别是等待锁的最长时间、time和指定时间单位的unity,该方法返回一个布尔,类型的结果在指定时间内锁可用。 防火处,否则返回4th在等待锁的过程中,当线程被中断时,还会引发线程中断异常。下面我们将使用try lock的重载方法来替代try look方法,三秒钟之内探索可不可用,使用拆开开启补和方法抛出的异常。下面来看看执行结果,从执行结果来看,第一个线程使用锁不到三秒钟就释放了,第二个线程由于三秒钟之内拿到锁,于是他就拿着锁完成了同步任务。最后来总结一下本节的内容。本节介绍了洛克索的两个非阻塞式获取锁的方法,这两个方法的作用在这里就不再赘述了,在实际开发中这两个方法经常被使用。
推荐阅读
-
22.无阻塞方式获取锁操作
-
玩转Java底层:JMX详解 - jconsole与自定义MBean监控工具的实际应用与区别" 在日常JVM调优中,我们熟知的jconsole工具通过JMX包装的bean以图形化形式展示管理数据,而像jstat和jmap这类内建监控工具则由JVM直接支持。本文将以jconsole为例,深入讲解其实质——基于JMX的MBean功能,包括可视化界面上的bean属性查看和操作调用。 MBeans在jconsole中的体现是那些可观察的组件属性和方法,如上图所示,通过名为"Verbose"的属性能看到其值为false,同时还能直接操作该bean的方法,例如"closeJerryMBean"。 尽管jconsole给我们提供了直观的可视化界面,但请注意,这里的MBean并非固定不变,开发者可根据JMX提供的接口将自己的自定义bean展示到jconsole。以下步骤展示了如何创建并注册一个名为"StudyJavaMBean"的自定义MBean: 1. 首先定义接口`StudyJavaMBean`,接口需遵循MBean规范,即后缀为"MBean"且包含getter方法代表属性,如`getApplicationName`,和无返回值的setter方法代表操作,如`closeJerryMBean`。 ```java public interface StudyJavaMBean { String getApplicationName(); void closeJerryMBean(); } ``` 2. 编写接口的实现类`StudyJavaMBeanImpl`,实现接口中的方法: ```java public class StudyJavaMBeanImpl implements StudyJavaMBean { @Override public String getApplicationName() { return "每天学Java"; } @Override public void closeJerryMBean() { System.out.println("关闭Jerry应用"); } } ``` 3. 在代码中注册自定义MBean,涉及的关键步骤包括: - 获取平台MBeanServer - 定义ObjectName,指定唯一的MBean标识符 - 注册MBean到服务器 - 启动RMI连接器服务,以便jconsole能够访问 ```java public void registerMBean() throws Exception { // ... 具体实现省略 ... } ``` 实际运行注册后的MBean,您将在jconsole中发现并查看自定义bean的属性和调用相关方法。然而,这种方式相较于传统的属性/日志查看和HTTP接口,实用性相对有限,可能存在潜在的安全风险。但不可否认的是,JMX及其MBean机制对于获取操作系统信息、内存状态等关键性能指标仍然具有重要价值。例如: 1. **获取操作系统信息**:通过JMX MBean,可以直接获取到诸如CPU使用率、操作系统版本等系统级信息,这对于资源管理和优化工作具有显著帮助。