博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程之Lock锁
阅读量:3948 次
发布时间:2019-05-24

本文共 1914 字,大约阅读时间需要 6 分钟。

Lock锁

  1. 从JDK5.0开始,Java提供了更强大的线程同步机制,通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当。
  2. java.util.concurrent.locks.Lock 接口时控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问。每次只能有一个线程对 Lock 对象加锁,线程开始访问共享资源前都应先获得Lock对象。
  3. ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是 ReentrantLock,可以显式加锁,释放锁。
  4. ReentrantLock 称为可重入锁

下面通过代码来演示一下

package org.javaboy.juc;import java.util.concurrent.locks.ReentrantLock;/** * @Author: bai * @DateTime: 2020/6/7 21:02 */public class TestLock implements Runnable {
int ticketNums = 10; private final ReentrantLock lock = new ReentrantLock(); // 定义lock锁 @Override public void run() {
while (true) {
try {
lock.lock();// 显式加锁 if (ticketNums > 0) {
try {
Thread.sleep(100); // 模拟延时操作 System.out.println(Thread.currentThread().getName() + "::" + ticketNums--); } catch (InterruptedException e) {
e.printStackTrace(); } } else {
break; } } finally {
lock.unlock(); // 显示解锁 } } } public static void main(String[] args) {
TestLock testLock = new TestLock(); new Thread(testLock, "小明").start(); new Thread(testLock, "小李").start(); new Thread(testLock, "黄牛党").start(); }}

代码解释:首先我们模拟多人抢票的场景,首先规定票数只有10张,然后我们通过票数判断是否已经被购完。在没有加入 ReentrantLock 之前,我们模拟的这个抢票场景会出现数据不一致问题,然后我们通过定义 ReentrantLock 锁,通过 lock.lock() 方法来显式加锁,通过 lock.unlock() 方法来显式解锁。这样就可以保证我们的数据一致性问题。

注意:一般我们显示加锁和解锁建议写在try/catch块中,这样就算发生了异常,finall 块依旧能够执行,我们的锁也可以被释放。这样就保证了程序的最起码的健壮性。

synchronized 与 Lock 的对比

  • Lock 是显式锁(手动开启和关闭),synchronized 是隐式锁,出了作用域自动释放。
  • Lock 只有代码块锁,synchronized 有代码块锁和方法锁。
  • 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的字类)
  • 优先使用顺序:Lock > 同步代码块(已经进入了方法体,分配了响应资源)> 同步方法(在方法体之外)

转载地址:http://tvqwi.baihongyu.com/

你可能感兴趣的文章
android 图库中对非mp4格式的视频去掉"修剪"功能选项
查看>>
how to disable watchdog
查看>>
android SDIO error导致wifi无法打开或者连接热点异常的问题
查看>>
android USB如何修改Serial Number or SN?
查看>>
android 用svn管理的版本编译出来有问题
查看>>
android 如何用jar包代替java代码编译
查看>>
android 数据连接关闭的情况下如何让彩信发不出去
查看>>
android 编辑彩信,加入几页铃声,预览暂停界面,铃声名字不见了
查看>>
android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
查看>>
android 关于LCD背光调节渐变过程引起背光闪烁问题
查看>>
android 保存具有不同前缀的同一号码分别为A和B,用其中一个呼叫,通话记录一直显示另一个联系人名字的问题
查看>>
android 在手机中预置联系人/Service Number
查看>>
android 系统语言为英语时,Contacts联系人名字含有特殊前缀后缀(Dr. Mr. Lt等)时的相关问题处理
查看>>
android 短信下,添加联系人,进入联系人多选界面出现联系人电话号码晃动的问题
查看>>
android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
查看>>
正确学习javascript。困惑的指南
查看>>
SERO幻影社区的背景怎么样?几大主流隐私币种技术分析!
查看>>
SERO目前具备的十大技术特点
查看>>
Neo4j CQL语句学习Day3
查看>>
Neo4j CQL学习Day4
查看>>