java 并发锁_Java并发教程–重入锁

java 并发锁

Java的synced关键字是一个很棒的工具–它使我们可以通过一种简单可靠的方式来同步对关键部分的访问,而且也不难理解。

但是有时我们需要对同步进行更多控制。 我们要么需要分别控制访问类型(读取和写入),要么使用起来很麻烦,因为要么没有明显的互斥锁,要么我们需要维护多个互斥锁。

幸运的是,在Java 1.5中添加了锁实用程序类,使这些问题更易于解决。

Java重入锁

Java在java.util.concurrent.locks包中有一些锁实现。

锁的一般类很好地布置为接口:

  • –最简单的锁,可以获取和释放
  • ReadWriteLock –具有读和写锁类型的锁实现–一次可以持有多个读锁,除非持有排他写锁

Java提供了我们关心的这些锁的两种实现–两者都是可重入的(这仅意味着线程可以多次重新获取同一锁而没有任何问题)。

  • ReentrantLock –如您所料,可重入锁实现
  • ReentrantReadWriteLock –可重入ReadWriteLock实现

现在,让我们看一些例子。

读/写锁定示例

那么如何使用锁呢? 这很简单:只需获取并发布(永远不要忘记发布-终于是您的朋友!)。

假设我们有一个非常简单的情况,我们需要同步访问一对变量。 一个是简单的值,另一个是根据一些冗长的计算得出的。 首先,这是我们如何使用synced关键字执行此操作。

public class Calculator {private int calculatedValue;private int value;public synchronized void calculate(int value) {this.value = value;this.calculatedValue = doMySlowCalculation(value);}public synchronized int getCalculatedValue() {return calculatedValue;}public synchronized int getValue() {return value;}
}

很简单,但是如果我们有很多争用,或者执行很多读取而写很少,则同步可能会影响性能。 由于频繁读取比写入频繁得多,因此使用ReadWriteLock可帮助我们最大程度地减少问题:

public class Calculator {private int calculatedValue;private int value;private ReadWriteLock lock = new ReentrantReadWriteLock();public void calculate(int value) {lock.writeLock().lock();try {this.value = value;this.calculatedValue = doMySlowCalculation(value);} finally {lock.writeLock().unlock();}}public int getCalculatedValue() {lock.readLock().lock();try {return calculatedValue;} finally {lock.readLock().unlock();}}public int getValue() {lock.readLock().lock();try {return value;} finally {lock.readLock().unlock();}}
}

此示例实际上显示了使用同步has的一大优势:与使用显式锁相比,此方法简洁明了且更加安全。 但是锁提供了使用灵活性,而这是我们以前所没有的。

在上面的示例中,我们可以让数百个线程一次读取相同的值而没有问题,并且只有在获得写入锁定时才阻塞读取器。 请记住:许多读取器可以同时获取读取锁,但是在获取写入锁时不允许读取器或写入器。

更典型的用途

我们的第一个示例可能会让您感到困惑或不完全相信显式锁是有用的。 难道他们还没有其他用途吗? 当然!

我们在Carfey使用显式锁来解决许多问题。 一个示例是您有可以同时运行的各种任务,但是您不希望同时运行多个相同类型的任务。 一种实现它的干净方法是使用锁。 可以通过同步来完成,但是锁使我们能够在超时后失败。

值得一提的是,您会注意到我们使用了同步锁和显式锁的混合-有时一个比另一个更干净,更简单。

public class TaskRunner {private Map<Class<? extends Runnable>,  Lock> mLocks =new HashMap<Class<? extends Runnable>,  Lock>();public void runTaskUniquely(Runnable r, int secondsToWait) {Lock lock = getLock(r.getClass());boolean acquired = lock.tryLock(secondsToWait, TimeUnit.SECONDS);if (acquired) {try {r.run();} finally {lock.unlock();}} else {// failure code here}}private synchronized Lock getLock(Class clazz) {Lock l = mLocks.get(clazz);if (l == null) {l = new ReentrantLock();mLocks.put(clazz, l);}return l;}
}

这两个示例应该使您对如何同时使用计划ReadWriteLocks有所了解。 与同步一样,不必担心重新获得相同的锁-JDK中提供的锁是可重入的,因此不会有任何问题。

每当您处理并发时,都有危险。 永远记住以下几点:

  • 释放所有锁,使其最终锁​​住。 这是规则1,是有原因的。
  • 当心线程饥饿! 如果您有不想永久等待的许多读者和偶尔的作家,那么ReentrantLocks中的公平设置可能会很有用。 如果其他线程不断持有读取锁,那么编写者有可能等待很长时间(也许永远)。
  • 尽可能使用同步。 您将避免错误并保持代码更清洁。
  • 如果您不希望线程无限期等待获取锁,请使用tryLock() -这类似于数据库具有的等待锁超时。

就是这样! 如果您有任何问题或意见,请随时将其留在下面。

参考: Java并发第2部分–来自JCG合作伙伴的Carent博客上的 Reentrant Locks 。

相关文章 :
  • Java并发教程–信号量
  • Java并发教程–线程池
  • Java并发教程–可调用,将来
  • Java并发教程–阻塞队列
  • Java并发教程– CountDownLatch
  • Exchanger和无GC的Java
  • Java Fork / Join进行并行编程
  • Java最佳实践–队列之战和链接的ConcurrentHashMap
  • 使用迭代器时如何避免ConcurrentModificationException
  • 改善Java应用程序性能的快速技巧

翻译自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-reentrant.html

java 并发锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sublime主题安装

网上发现与之前最相近的两款皮肤分别是Theme – Soda与Flatland。这里就记录一下安装与使用方法。 方法一&#xff1a;手动下载安装&#xff1a; 1.下载安装SublimeText2&#xff0c;这个我就不说了。网上的版本有多个&#xff0c;可以自行选择。也可下载使用最新的SublimeText…

WebCrack:网站后台弱口令批量检测工具

经过这么长时间的测试终于算是可以上线了&#xff0c;写篇文章跟大家分享一下自己的开发思路吧 >注&#xff1a;本工具借鉴吸收了TideSec的web_pwd_common_crack很多优秀的思路&#xff0c;在此基础上增加了很多拓展功能使其更加强大&#xff0c;在这里给TideSec的大佬点个赞…

前端渲染与后端渲染之间的区别?

前端没兴起之前,网页的展示大都是后端渲染,也就是服务器渲染。 随着前端行业的发展,前端的工作越来越精细。前后端开始分离,前端只关注ui渲染。后端只提供数据和进行逻辑处理。 简单的解释,前端写好html模板,让后端直接填数据,这就是后端渲染。 前端渲染是,通过ajax请求…

比较中的Commons VFS,SSHJ和JSch

几周前&#xff0c;我评估了一些用于Java的SSH库。 对它们的主要要求是在远程计算机上进行文件传输和文件操作。 因此&#xff0c;它存在一个基于SSH&#xff0c;SSH文件传输协议&#xff08;或SFTP&#xff09;的网络协议。 因此&#xff0c;我需要一个支持SFTP的SSH库。 一项…

Android自定义xml解析

<?xml version"1.0" encoding"utf-8"?> <resources><Users><User name"jason" age"12" location"Beijing"/><User name"peter" age"18" location"Shanghai"/&g…

前端常见的安全性问题有哪些?

安全性 前端安全问题有哪些? XSS 跨站请求攻击XSRF 跨站请求伪造上边这两个问题,前端也只是辅助,主要还是靠后端XSS原理 在博客里可以写文章,同时偷偷插入一段<script>代码。发布博客,有人查看博客内容打开博客时,就会执行插入的js攻击代码在攻击代码中,获取cook…

(fofa信息收集骚操作)windows查看文件的md5值

1、winr 输入cmd进入控制界面 2、certutil -hashfile XXXX md5(XXXX为绝对路径) Linux下查看文件md5值&#xff1a; 进入文件目录&#xff0c;使用md5sum加文件名&#xff0c;例如md5sum test.txt 像fofa的语法里有可以查找js的md5值&#xff0c;这样就可以收集到更多信息了&…

教你读懂Ajax的工作原理

Ajax的工作原理 1、ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth、google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的流行。而这也让微软感到无比的尴尬,因为早在97年,微软便已经发明了ajax中的关键技术,并且在99年I…

二叉树性质及遍历

一、二叉树的定义 树的每个结点至多只有二棵子树(不存在度大于2的结点)&#xff0c;树的子树有左右之分&#xff0c;次序不能颠倒。 二、二叉树的性质 (1) 在非空二叉树中&#xff0c;第i层的结点总数不超过, i>1&#xff1b;(2) 深度为h的二叉树最多有个结点(h>1)&#…

利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

目标环境&#xff1a; 比如&#xff0c;目标存在一个上传的逻辑&#xff1a; <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht])) {exit(bad file);}mo…

将数据压缩到数据结构中

这个故事是关于我们最近在Plumbr进行的容量优化任务。 一切始于将无害的要求添加到现有组合中。 如您所知&#xff0c;Plumbr监视解决方案作为连接到服务器的Java代理分发。 只需少量添加即可跟踪一段时间内所有已连接的代理&#xff0c;以便可以实时回答以下问题&#xff1a;…

程序员面试需要注意的问题

今天给朋友带来的是找一份工作的流程详细介绍&#xff0c;以及期间所需要注意的东西&#xff0c;其中包括&#xff1a; 简历&#xff08;附带写简历的注意事项&#xff09;笔试&#xff08;附带笔试题详细介绍的链接&#xff09;电话面试(附带常见的面试题)面试&#xff08;详…

CVE-2017-15715漏洞复现

复现环境 docke apache 2.4.0到2.4.29即可 php5.5 复现过程 先在物理机上创建目录 mkdir -p /var/www/html 然后创建个容器&#xff0c;并关联物理机的/var/www/html目录 docker run -d -v /var/www/html:/var/www/html -p 8080:80 --name apache php:5.5-apache 再把物理机的/…

Linux网络流量实时监控ifstat iftop命令详解

ifstat 介绍 ifstat工具是个网络接口监测工具,比较简单看网络流量 实例 默认使用 #ifstateth0 eth1 KB/s in KB/s out KB/s in KB/s out0.07 0.20 0.00 0.000.07 0.15 0.58 0.00 默认ifstat不监控回环接口&#xff0c;…

一种移动端自适应屏幕的方法

前端移动端开发的时候肯定是会面对不同型号的手机的页面展示问题的&#xff0c;今天给大家推出另外一种自适应不同移动端的方法&#xff0c;使用vw&#xff0c;vh单位。 vw和vh单位的大小是多少&#xff1f; vw和vh是根据设备的宽度和高度来决定的&#xff0c;设备的宽就是10…

Metasploit--后渗透(一些基本操作方法)

查看主机是否运行在虚拟机上 run post/windows/gather/checkvm关闭杀毒软件 拿到目标主机的shell后第一件事就是关闭掉目标主机的杀毒软件&#xff0c;通过命令 run killav获取目标主机的详细信息 run scraper它将目标机器上的常见信息收集起来然后下载保存在本地 Meterpre…

CentOS6 下Vim安装和配置

1.系统只安装了vim-minimal&#xff0c;执行以下命令安装另外两个组件 yum install vim-common yum install vim-enhanced 2.安装ctags yum install ctags 下载linux-2.6.32.27内核源码并解压到~/arm/linux-2.6.32.27&#xff0c;进入该目录&#xff0c;生成索引文件 ctags -R …

端到端测试_端到端测试的滥用–测试技术2

端到端测试我的上一个博客是有关测试代码方法的一系列博客中的第一篇&#xff0c;概述了使用一种非常常见的模式从数据库检索地址的简单方案&#xff1a; …并描述了一种非常通用的测试技术&#xff1a; 不编写测试 &#xff0c; 而是手动进行所有操作。 今天的博客涵盖了另一…

vue全家桶指的是哪些?

vue全家桶&#xff1a; vue&#xff08;整体架构&#xff09;  vuex&#xff08;状态管理&#xff09;  vue-router&#xff08;路由&#xff09;  vue_resource || axios&#xff08;ajax请求&#xff09;  mint-UI(移动端UI框架库) || antd-vue(PC端UI框架库)

Metasploit 之生成木马(msfvenom)

msfvenom参数 相关参数介绍 -p, --payload <payload> 指定需要使用的payload(攻击荷载) -l, --list [module_type] 列出指定模块的所有可用资源,模块类型包括: payloads, encoders, nops, all -n, --nopsled <length> 为payload预先指定一个NOP滑动长度 -f, --for…