ReentrantLock简介

ReentrantLock是一个可重复的互斥锁,又被称为独占锁,可重入的意思是:ReentrantLock锁可以被单个线程多次获取。但是在同一个时间点只能被一个线程锁持有

ReentrantLock使用一个FIFO(先进先出)的等待队里来管理获取该锁所有线程的。

ReentrantLock是一个独占锁,在获取锁的之后其所有的操作都是线程独享的,其他的线程在没有获取到锁之前都需要等待。

public class ReentrantLock implements Lock,java.io.Serializable

ReentrantLock之中分为公平锁与非公平锁,它们的区别体现在获取锁的机制上是否公平以及执行速度上。、

这两种锁的启用也是非常容易控制的,这个类提供的构造方法如下:

  • 无参构造(非公平锁,NonfairSync)

    public ReentrantLock() {sync = new NonfairSync();
    }

  • 有参构造
    public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();
    }//fair = true,表示公平锁,FairSync//fair  = false,表示非公平锁,NonfairSync

ReentrantLock继承结构

范例:使用ReentrantLock定义一个多线程卖票的处理程序

package so.strong.mall.concurrent;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class Ticket {private Lock myLock = new ReentrantLock();  //非公平锁private int count = 10; //一共10张票public void sale() {myLock.lock(); //进入到阻塞状态,一直到unlock执行后解除阻塞try {if (this.count > 0) {System.out.println(Thread.currentThread().getName() + "卖票,ticket=" + this.count--);}} finally {myLock.unlock(); //不管最终结果如何一定要进行解锁
        }}
}public class TestDemo {public static void main(String[] args) {final Ticket ticket = new Ticket(); //多线程要共享同一个数据资源for (int i = 0; i < 6; i++) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {ticket.sale(); //卖票处理
                    }}}).start();}}
}

Thread-0卖票,ticket=10
Thread-0卖票,ticket=9
Thread-0卖票,ticket=8
Thread-0卖票,ticket=7
Thread-0卖票,ticket=6
Thread-0卖票,ticket=5
Thread-0卖票,ticket=4
Thread-2卖票,ticket=3
Thread-2卖票,ticket=2
Thread-2卖票,ticket=1

当前的代码要比直接使用synchronized更加容易,而且锁的处理机制更加的直观。通过查看源代码可以发现,使用lock()进行锁定的时候会考虑两种情况:

Sync-java.util.concurrent.locks.ReentrantLock

  • FairSync-java.util.concurrent.locks.ReentrantLock
  •  NonFairSync-java.util.concurrent.locks.ReentrantLock

在进行公平锁处理的时候每当锁定一个线程对象就会使用“acquire(1)”方法进行表示:

final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);
}

在进行解锁时会使用一个"sync.release(1)”释放方法, 1 表示释放一个:

public void unlock() {sync.release(1);
}

转载于:https://www.cnblogs.com/itermis/p/8961003.html

JUC——线程同步锁(ReentrantLock)相关推荐

  1. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  2. 同步锁ReentrantLock

    http://www.cnblogs.com/hoojo/archive/2011/05/05/2038101.html Java Thread 多线程同步.锁.通信 线程同步.同步锁.死锁 线程通信 ...

  3. java同步锁售票_线程同步锁之火车站售票案例

    前言: 谈到多线程,就不得不说线程同步,那么什么是线程同步? 线程同步 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作 ...

  4. 【并发】线程同步——锁Lock与synchronized比较

    一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...

  5. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  6. @Java | Thread synchronized - [ 线程同步锁 基本使用]

    对实现了Runnable或者Callable接口类,可以通过多线程执行同一实例的run或call方法,那么对于同一实例中的局部变量(非方法变量)就会有多个线程进行更改或读取,这就会导致数据不一致,sy ...

  7. python线程同步锁_[python] 线程间同步之Lock RLock

    为什么需要同步 同样举之前的例子,两个线程分别对同一个全局变量进行加减,得不到预期结果,代码如下: total = 0 def add(): global total for i in range(1 ...

  8. python 线程锁_Python3多线程执行任务含线程同步锁

    Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...

  9. Java 中线程同步锁和互斥锁

    一 概述 1.1 互斥 所谓互斥,就是不同线程,通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源.如不允许同时写. 1.2 同步 同步关系 ...

最新文章

  1. 链表问题12——将单链表的每K个节点之间逆序(方法二)
  2. ganglia安装与配置
  3. 2021-06-05
  4. 3a算法 isp_Isp图像算法工程师
  5. 此工作簿包含到其他数据源的链接
  6. sqlserver删除指定列失败
  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
  8. springsecurity sessionregistry session共享_不用 Spring Security 可否?试试这个小而美的安全框架...
  9. MySQL MHA 安装
  10. iPhone编程的一些技巧总结
  11. 数据库,XML,MDB --- 我们来TXT...
  12. SpringBoot 2 要不要升级
  13. 观察者模式实际例子demo
  14. cds5516舵机控制程序_[电力世界]中的应用程序CDS
  15. 20190805:两个队列实现栈
  16. 蓝桥杯 BASIC-30 基础练习 阶乘计算
  17. 【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing
  18. jquery匹配不区分大小写_jQuery实现contains方法不区分大小写的方法教程
  19. 安卓显示视频画面的动画效果及代码
  20. PTA 基础练习答案

热门文章

  1. 历史命令history
  2. bmp文件格式详细解析
  3. 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)
  4. Java™ 教程(Queue接口)
  5. 关于Java中next() nextLine()的区别
  6. 抢领英饭碗?Facebook测试简历功能
  7. Spring学习进阶 (三) Spring AOP
  8. nginx学习七 高级数据结构之动态数组ngx_array_t
  9. 在Linux平台上部署open***
  10. 图片浏览(CATransition)转场动画