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

使用重入锁实现线程同步

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁,

它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。

ReenreantLock类的常用方法有:

ReentrantLock() : 创建一个ReentrantLock实例

lock() : 获得锁

unlock() : 释放锁

注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用

代码展示如下:public class Bank

{

private int count = 0; // 账户余额

// 需要声明这个锁

private Lock lock = new ReentrantLock();

// 存钱

public void addMoney(int money)

{

lock.lock();

try

{

count += money;

System.out.println(System.currentTimeMillis() + "存进:" + money);

}

finally

{

lock.unlock();

}

}

// 取钱

public void subMoney(int money)

{

lock.lock();

try

{

if (count - money

{

System.out.println("余额不足");

return;

}

count -= money;

System.out.println(+System.currentTimeMillis() + "取出:" + money);

}

finally

{

lock.unlock();

}

}

// 查询

public void lookMoney()

{

System.out.println("账户余额:" + count);

}

}

运行结果如下图:

需要注意的是:

1、ReentrantLock()还可以通过public ReentrantLock(boolean

fair)构造方法创建公平锁,即,优先运行等待时间最长的线程,这样大幅度降低程序运行效率。

2、关于Lock对象和synchronized关键字的选择:

(1)、最好两个都不用,使用一种java.util.concurrent包提供的机制,能够帮助用户处理所有与锁相关的代码。

(2)、如果synchronized关键字能够满足用户的需求,就用synchronized,能简化代码。

(3)、如果需要使用更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally中释放锁。

以上就是关于java多线程同步之重入锁的详细解析了。如果你对java知识感兴趣,想要了解更多java基础,敬请关注奇Q工具网。

推荐阅读:

线程同步锁 java_java多线程同步之重入锁,详细解析相关推荐

  1. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  2. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  3. java中多线程reentlock_Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  4. c语言线程锁的原理开锁原理图,C++多线程之可重入锁

    #include #include #include using namespace std; recursive_mutex re; void task1() { re.lock(); cout & ...

  5. 锁Lock,主要是重入锁和读写锁

    2019独角兽企业重金招聘Python工程师标准>>> 在java多线程中,我们可以使用synchronized关键字来实现线程之间的同步互斥工作.还有一个更优秀的机制去完成这个&q ...

  6. 可重入锁 不可重入锁_什么是可重入锁?

    可重入锁 不可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为可重入锁定. 在此之前,"同步"和"易失性"是实现并发的手段. public ...

  7. 可重入锁_什么是可重入锁?

    可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为Reentrant Lock. 在此之前,"同步"和"易失"是实现并发的手段. publ ...

  8. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  9. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

最新文章

  1. redhad yum 安装mysql_yum安装Mysql
  2. 密码错误时alert弹出_密码重置用户流程4部曲
  3. 改变PCM采样点计算来控制音量
  4. Android Button常用属性
  5. Python微博项目
  6. 关联性——相关性分析
  7. Unity 窗口制作 调整窗口大小 动态调整UI大小 窗口拖拽 UI拖拽
  8. 深入理解JavaScript系列(30):设计模式之外观模式
  9. Android 与Vue 页面交互
  10. 2020.04.15软件构造听课笔记
  11. Android 自动接听电话和挂断
  12. HotSpot GC的分类
  13. MacBook Pro如何安装Python编译器
  14. 关于1588 PTP的IGB网卡驱动代码分析
  15. 2020年区块链和分布式账本技术的5大趋势
  16. android+4.4.2+隐藏虚拟按钮,Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法...
  17. 在Vmware虚拟机中安装Ubuntu16.04(server版)操作系统
  18. 服务器销售模式,页游营销新模式:开设名人专属服务器
  19. ajax 返回的数据有换行符,前端如何展示出来?
  20. 初识C语言之——static修饰变量及函数的认知。

热门文章

  1. 步态识别 GaitSet
  2. python elasticsearch 更新后刷新
  3. no output in console for unittests in pycharm 2017
  4. The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0
  5. 41 Ansible安装
  6. JUNIPER设备常用命令总结
  7. php中的解析范围符,PHP 的范围解析操作符 (::) 的含义分析说明
  8. WSGI、Flask及Werkzeug三者之间的关系
  9. java之Servlet的生命周期
  10. CMake添加-g编译选项