又是一个基于AQS好用的类,看来下次有必要看看AQS了,正好又是放假。

既然叫显式锁,必然也有隐式锁,也就是所谓的synchronzied关键字,它们两者的区别呢在于使用范围,synchronzied关键字的使用范围比Lock要小,在Lock的实现类中与synchronzied相近似的类叫ReentrantLock,也叫可重入锁,待会儿在说看看Lock吧

Lock

是一个接口,主要的实现类有三个 ReadLock(写锁),WriteLock(读锁),ReentrantLock(可重入锁)

核心方法:

1、lock():获取锁并上锁。

2、unlock():释放锁,未释放会造成阻塞,一般放在程序的finally代码块中。

3、tryLock():尝试的获取锁,带参数的为超时尝试获取锁。

4、newCondition():获取到Condition接口的实现类,用于配合Lock实现等待通知功能,每调用一次就获取一个新的Condition,并非只有一个

5、 lockInterruptibly():获取锁但是可以中断这个锁。

使用示例:

static Lock lock = new ReentrantLock();
static int count = 0;public static void main(String [] arg0){lock.lock();//获取锁try{count ++ ;}finally{lock.unlock();//释放锁}}
//该示例就做一个统计吧

可重入锁(ReentrantLock

就是可以重复获取锁,但是这种一般出现于递归算法,重复获取了多少次锁就会释放多少次锁。

看一个案例:

static Lock lock = new ReentrantLock();static int count = 0;public synchronized static void addIntger() {count ++;while(count<10) {addIntger();//可重入锁}}public static void addLockIntger() {lock.lock();try {count ++;while(count<10) {addLockIntger();//可重入锁}} finally {lock.unlock();}}public static void main(String[] args) {System.out.println(count);addLockIntger();System.out.println(count);}

公平锁和非公平锁

公平锁(new FairSync()):即同一时刻去多个线程请求锁,先到先得,排队获取锁即为公平锁,未获取到锁的线程会被挂起(非阻塞等待,是会进入到AQS的尾队列等待,跟非公平锁比,耗时就是花费在这里),等到锁释放后按照顺序获取锁,所以与非公平锁相比,更耗时。

非公平锁(new NonfairSync()):即同一时刻多个线程去请求锁,不是按照先到先的顺序获取锁即为非公平锁,无需进入AQS队列等待,运行速度更快,创建Lock对象默认为非公平锁。

这两种锁都继承了AQS(不得不说Doug Lea大师的强大),公平锁适合在按顺序执行的场景。

读写锁(ReadWriteLock)

ReadWriteLock并没有继承Lock接口,而是在它的实现类中ReentrantReadWriteLock有两个内部类却继承了Lock接口,即为ReadLock和WriteLock,这两均实现了AQS抽象类。

这个种锁使用的场景为读多写少的场景,在获取写锁时,读写锁都会进入阻塞状态,而获取读锁并不会进入阻塞状态。

public interface ReadWriteLock {/*** Returns the lock used for reading.** @return the lock used for reading*/Lock readLock();/*** Returns the lock used for writing.** @return the lock used for writing*/Lock writeLock();
}

Condition

可以配合Lock使用等待通知模式,这里就不演示啦,与之前的wait()notify/notifyAll()相近似,看一下这个接口中的方法定义:

1、await():类似于Object的wait()等待。

2、awaitUninterruptibly():这个表示等待不可中断,其他的等待都可以被中断。

3、awaitNanos(long):超时等待。

4、awaitUntil(Date):可指定时间超时等待,与上面几种超时方法差不多。

5、signal():类似与Object中的notify()。

6、signalAll():类似与Object中的notifyAll()。

LockSupport

是Lock的支持类,里面都是静态方法

主要是用来阻塞、唤醒一个线程

1、park():阻塞当前线程

2、unpark(Thread t):唤醒指定线程

park也有其他带参数的方法,基本都是不同形式的超时等待方法。

好啦差不多就这样了,Lock的用途还是挺广泛的,在很多开源包都能看见这个的身影,比如阿里的Druid连接池中就用到了。写的并不是很好,各路大佬可以在评论里面补充咯

Java并发编程之显式锁(Lock)使用相关推荐

  1. java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  2. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  3. Java并发编程实战之互斥锁

    文章目录 Java并发编程实战之互斥锁 如何解决原子性问题? 锁模型 Java synchronized 关键字 Java synchronized 关键字 只能解决原子性问题? 如何正确使用Java ...

  4. 显式锁Lock的集大成之作,最细节教程

    显式锁是什么? 我们一般喊synchronized就叫synchronized.其实synchronized又被称为隐式锁,但我们就爱喊它synchronized.而显式锁就是我们一般说的Lock锁, ...

  5. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  6. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  7. java 显式锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  8. Java并发编程(05):悲观锁和乐观锁机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...

  9. Java并发编程学习四:锁

    一.锁的分类 Java中有着各种各样的锁,对于锁的分类也是多种多样,一把锁可能同时占有多个标准,符合多种分类. 对锁的常见分类有以下几个标准: 1. 偏向锁/轻量级锁/重量级锁 这三种锁特指 sync ...

最新文章

  1. js面试题知识点全解(一作用域)
  2. 为什么会出现 java.util.ConcurrentModificationException 异常?
  3. 深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型...
  4. 建立网络安全新生态,网络态势感知至关重要
  5. [github高级控件] 带你走近 - CircleIndicator指示器原点动画切换
  6. TSC打印bmp图片命令
  7. matlab矩阵排序sort,MATLAB数组元素的排序
  8. 你来分我先选 原则
  9. 计算机窗口弹出多个窗口,电脑怎么打开多个微信窗口
  10. unity四种Text总结
  11. NAT转换技术(SNAT、MASQUERADE、DNAT策略)及代理服务(squid服务)
  12. uoj198【CTSC2016】时空旅行
  13. 字符串截取字符串截取,substring
  14. JS中将中文数字转化为阿拉伯数字
  15. 深度学习 机器学习基础_实用的机器学习基础
  16. 学Java的逻辑测试题_面试中的逻辑题测试及答案.doc
  17. Youtube的个人视频门户:Portal:Youtube director
  18. 三星文档html删除吗,HTML5新增标签和删除的标签
  19. vue-element-admin安装运行是英文界面调整为中文
  20. (介孔sio2) 介孔二氧化硅微球的应用

热门文章

  1. mysql-5.5.56配置_mysql 5.5.56免安装版配置方法
  2. ZOJ 3804 YY's Minions (简单模拟)
  3. 2.2线性表的顺序表
  4. 爱特php文件管理器2.8_查找「超级蜘蛛池开发者中心 抠:44564876易」安卓应用 - 豌豆荚...
  5. 怎么用python编程前二n-1项的等差数列的和_python 等差数列末项计算方式
  6. 鸿蒙系统年底问世视频,鸿蒙系统年底问世 什么时候上市使用
  7. phpmyadmin 导出mysql,在phpmyadmin中导入/导出非常大的mysql数据库
  8. mysql高级查询教程_MYSQL高级查询
  9. 初识Hadoop:大数据与Hadoop概述
  10. Linux Vi的使用