线程同步锁 java_java多线程同步之重入锁,详细解析
上次已经为大家介绍过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多线程同步之重入锁,详细解析相关推荐
- 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)
在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...
- Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- java中多线程reentlock_Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- c语言线程锁的原理开锁原理图,C++多线程之可重入锁
#include #include #include using namespace std; recursive_mutex re; void task1() { re.lock(); cout & ...
- 锁Lock,主要是重入锁和读写锁
2019独角兽企业重金招聘Python工程师标准>>> 在java多线程中,我们可以使用synchronized关键字来实现线程之间的同步互斥工作.还有一个更优秀的机制去完成这个&q ...
- 可重入锁 不可重入锁_什么是可重入锁?
可重入锁 不可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为可重入锁定. 在此之前,"同步"和"易失性"是实现并发的手段. public ...
- 可重入锁_什么是可重入锁?
可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为Reentrant Lock. 在此之前,"同步"和"易失"是实现并发的手段. publ ...
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除
文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...
最新文章
- redhad yum 安装mysql_yum安装Mysql
- 密码错误时alert弹出_密码重置用户流程4部曲
- 改变PCM采样点计算来控制音量
- Android Button常用属性
- Python微博项目
- 关联性——相关性分析
- Unity 窗口制作 调整窗口大小 动态调整UI大小 窗口拖拽 UI拖拽
- 深入理解JavaScript系列(30):设计模式之外观模式
- Android 与Vue 页面交互
- 2020.04.15软件构造听课笔记
- Android 自动接听电话和挂断
- HotSpot GC的分类
- MacBook Pro如何安装Python编译器
- 关于1588 PTP的IGB网卡驱动代码分析
- 2020年区块链和分布式账本技术的5大趋势
- android+4.4.2+隐藏虚拟按钮,Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法...
- 在Vmware虚拟机中安装Ubuntu16.04(server版)操作系统
- 服务器销售模式,页游营销新模式:开设名人专属服务器
- ajax 返回的数据有换行符,前端如何展示出来?
- 初识C语言之——static修饰变量及函数的认知。
热门文章
- 步态识别 GaitSet
- python elasticsearch 更新后刷新
- no output in console for unittests in pycharm 2017
- The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0
- 41 Ansible安装
- JUNIPER设备常用命令总结
- php中的解析范围符,PHP 的范围解析操作符 (::) 的含义分析说明
- WSGI、Flask及Werkzeug三者之间的关系
- java之Servlet的生命周期
- CMake添加-g编译选项