全面了解Java中的15种锁概念及机制。

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:

1.公平锁 / 非公平锁

2.可重入锁 / 不可重入锁

3.独享锁 / 共享锁

4.互斥锁 / 读写锁

5.乐观锁 / 悲观锁

6.分段锁

7.偏向锁 / 轻量级锁 / 重量级锁

8.自旋锁

上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。

公平锁/非公平锁

公平锁

公平锁是指多个线程按照申请锁的顺序来获取锁。

非公平锁

非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。

对于 Java ReentrantLock 而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。

对于 Synchronized 而言,也是一种非公平锁。由于其并不像 ReentrantLock 是通过 AQS 的来实现线程调度,所以并没有任何办法使其变成公平锁。

可重入锁/不可重入锁

可重入锁

广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。 ReentrantLock 和 synchronized 都是可重入锁

synchronized void setA() throws Exception{
   Thread.sleep(1000);
   setB();
}
synchronized void setB() throws Exception{
   Thread.sleep(1000);
}
复制代码

上面的代码就是一个可重入锁的一个特点,如果不是可重入锁的话,setB可能不会被当前线程执行,可能造成死锁。

不可重入锁

不可重入锁,与可重入锁相反,不可递归调用,递归调用就发生死锁。看到一个经典的讲解,使用自旋锁来模拟一个不可重入锁,代码如下:

import java.util.concurrent.atomic.AtomicReference;
​
public class UnreentrantLock {
​
   private AtomicReference<Thread> owner = new AtomicReference<Thread>();
​
   public void lock() {
       Thread current = Thread.currentThread();
       //这句是很经典的“自旋”语法,AtomicInteger中也有
       for (;;) {
           if (!owner.compareAndSet(null, current)) {
               return;
           }
       }
   }
​
   public void unlock() {
       Thread current = Thread.currentThread();
       owner.compareAndSet(current, null);
   }
}
复制代码

代码也比较简单,使用原子引用来存放线程,同一线程两次调用lock()方法,如果不执行unlock()释放锁的话,第二次调用自旋的时候就会产生死锁,这个锁就不是可重入的,而实际上同一个线程不必每次都去释放锁再来获取锁,这样的调度切换是很耗资源的。

把它变成一个可重入锁:

import java.util.conc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: XXL-Job是一个轻量级分布式任务调度平台,具有易于集成和部署、稳定性高、功能丰富等特点。以下是一些XXL-Job的核心概念和功能: 1. 调度心:XXL-Job调度心是一个Web应用程序,用于管理任务的创建、修改、删除和执行。调度心还提供了任务执行日志、调度统计和报警功能等。 2. 执行器:XXL-Job执行器是一个Java应用程序,用于接收和执行任务。执行器会向调度心定时发送心跳以保持连接,并接收调度心分配的任务进行执行。 3. 任务:XXL-Job任务是一个Java方法,可以通过执行器运行。任务可以通过调度心进行管理,包括创建、修改、删除、暂停和恢复等操作。 4. 路由策略:XXL-Job提供了多种路由策略,例如按任务名、按分片等方式路由任务。 5. 分片:XXL-Job支持任务分片,将一个任务分成多个子任务并交给多个执行器并行执行。任务分片可以提高任务的并发度和执行效率。 6. 任务依赖:XXL-Job支持任务依赖,即一个任务可以依赖于另一个任务的执行结果。当依赖的任务执行完成后,才会开始执行依赖它的任务。 7. 报警:XXL-Job提供了报警功能,可以根据任务的执行结果和调度状态进行报警,例如执行失败、超时、错过调度等情况。 总的来说,XXL-Job是一个易于集成和部署、功能丰富的分布式任务调度平台,适用于各种任务调度场景。 ### 回答2: xxl-job是一个分布式任务调度框架,可以用来实现各种定时任务和异步任务的调度和执行。它提供了可视化的任务管理界面,以及强大的任务调度功能。 首先,xxl-job支持多种任务类型,包括简单的定时任务、固定延迟任务和CRON表达式任务。通过配置任务的执行策略和参数,可以灵活地满足各种任务需求。 其次,xxl-job提供了自动化的任务调度机制。它可以根据任务的执行情况,自动进行任务调度和失败重试。同时,还可以设置任务的失败告警机制,及时通知开发人员任务执行的失败情况。 第三,xxl-job提供了任务分片机制,可以将大任务划分为多个小任务,分配给不同的执行器进行执行。这样可以提高任务执行的效率和并发能力。 此外,xxl-job还支持任务的动态添加、暂停和恢复。开发人员可以通过API或者管理界面,实现任务的动态管理,无需重启应用就可以生效。 最后,xxl-job提供了丰富的管理界面,方便开发人员进行任务的配置和管理。可以通过界面查看和监控任务的执行情况,也可以查看任务的调度日志和错误日志,便于排查和分析问题。 综上所述,xxl-job是一个简单又全面的分布式任务调度框架。它不仅提供了多种任务类型和调度策略,还支持任务的动态管理和监控。在级程序员面试,如果能够熟练掌握xxl-job的使用和原理,将会给面试官留下良好的印象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值