Java Syncrhonisers

线程通信主要通过共享对字段和对象的访问来发生。 尽管这种通信方式非常高效,但它易于出现诸如线程干扰和内存一致性之类的错误。 同步是一种有助于防止此类错误的工具。

但是,同步不是免费提供的,并且在访问当前由另一个线程持有的锁或对象时会引入延迟。 等待中的线程无法使用该对象,直到另一个线程释放该对象上的锁。 这种情况称为线程争用。 它还可能导致死锁和活锁。

在本文中,我们将探讨Java提供的用于处理线程同步的不同选项。

同步要点

Java提供了一系列机制来处理基本线程同步和协调。 它支持通过同步方法和同步语句进行细粒度的对象访问同步。 基本线程协调可以通过受保护的块来完成。 所有提到的机制都是围绕获取和释放对象的固有锁定而构建的。

内在锁

每个Java对象都有一个关联的固有锁。 需要对对象的字段进行独占访问的线程必须在访问对象之前获取对象的锁,然后在完成后释放固有的锁。 其他尝试访问该对象的线程将阻塞,直到持有锁的线程将其释放为止。

同步方法

当线程调用同步方法时 ,它获取该方法对象的内在锁 ,并在方法返回时释放它。 即使该方法由于未捕获的异常而返回,也将释放该锁定。 如果以静态方法完成,则线程将获取与该类关联的类对象的锁。

同步语句

提供更细粒度的同步机制。 同步语句必须指定提供内部锁的对象。 在分离的锁对象上进行同步可以提供字段同步,而无需强制方法调用之间进行同步。

守卫的块

如前所述,受保护的块为线程协调提供了支持。 受保护的块是每个Java对象的一部分,可以使用waitnotifynotifyAll方法构造。

wait方法挂起当前线程。 当线程调用wait时,它必须拥有对象的固有锁,这就是为什么wait调用通常包装在同步方法或语句中的原因。 调用wait方法将挂起线程执行并释放锁。

在某个时刻,另一个线程将获取对象的固有锁,并调用notifyAll来通知所有线程等待发生重要事件。 在第二个线程释放锁之后,等待的线程将重新获取该锁,并通过从等待调用中返回来恢复执行。

Notify唤醒单个线程。 无法指定唤醒的具体线程,因此,仅在我们不关心哪个线程被唤醒时才有用。

Java同步器

Java还提供了五个用于通用特殊用途同步的类。

CountDownLatch

CountDownLatch类允许一个或多个线程等待,直到其他线程中的一组操作完成。 用计数编号初始化。

await方法将阻塞,直到计数达到零为止。

countDown方法减少计数。

当await方法返回时,将释放所有等待线程,并且随后的await调用将立即返回。 计数无法重置。

信号

信号量用于限制线程对特定资源的访问。 初始化具有许多许可证。

acquire方法将一直阻塞,直到获得许可并获得许可为止。

release方法添加许可,释放阻止获取者。

请注意,调用release不一定必须由称为Acquisition的线程进行。 信号量可以是公平的,也可以是不公平的 。 如果公平,则线程以FIFO方式获取许可。

尽管起初它看上去与CountDownLatch类似,但其目的却完全不同。

循环屏障

CyclicBarrier建立在各方概念的周围。 它允许线程等待彼此到达一个公共的障碍点。

await方法将阻塞,直到各方到达为止。 它的行为与CountDownLatch的逆过程相同。 N等待之后,它继续。

它支持每个障碍点运行一次的可选可运行对象。 在最后一个聚会到达之后,但在释放之前。 它通常用于更新线程之间的共享状态。 它是循环的,因为它可以在线程释放后重用

交换者

Exchanger是两个线程可以交换信息的同步点。

线程将阻塞,直到其对方显示其信息为止。 双方都发生相同的行为。

移相器

Phaser是一个可重用的屏障,类似于CountDownLatchCyclirBarrier ,但更加灵活。

在Phaser中,创建时注册方的数量不是固定的。 双方可以在通过任何注册registerbulkRegister方法。 双方可以在抵达时注销arriveAndDeregister

它提供了几种同步方法。 arriveAndAwaitAdvance方法的行为与CycleBarrier await方法的行为相同。 arrivearrivearriveAndDeregister记录到达,但不要阻塞。 awaitAdvance阻塞,直到各方到达为止。

它可以终止 ,强制所有同步方法返回。 可以通过forceTermination方法强制forceTermination

它还提供了监视其状态的支持。 值得注意的是,同步方法只能由注册方调用,而状态可以由任何调用者监视。 监视方法包括getRegisteredPartiesgetArrivedParties等。

结论

多线程绝对不是一个简单的问题,但是使用某些语言提供的工具可以更轻松地解决多线程问题。 就个人而言,我不需要每天使用所有工具,但是我认为有必要知道它们的存在以及如何提供帮助。

翻译自: https://www.javacodegeeks.com/2016/08/the-java-syncrhonisers.html

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

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

相关文章

MATLAB的VLFeat工具箱

下载地址:http://www.vlfeat.org/ 简介:VLFeat开源库实现了流行的计算机视觉算法,专门用于图像理解和局部特征提取和匹配。算法包括Fisher向量、VLAD、SIFT、MSER、k-means、分级k-means、agglomerative information bottleneck、SLIC超像素…

Phinecos(洞庭散人) 专注于开源技术的研究与应用 TinyXML:一个优秀的C++ XML解析器

读取和设置xml配置文件是最常用的操作,试用了几个C的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C,能…

windows聚焦壁纸不更新_Win10无法自动更换聚焦锁屏壁纸怎么办?

Win10无法自动更换聚焦锁屏壁纸怎么办?在Win10系统的默认情况下,锁屏界面设置的是Windows聚焦,如果我们使用微软账户登录,系统会自动更换锁屏壁纸,让我们每天都能看到不一样的锁屏壁纸。然而有用户发现,系统…

jdbc-------JDBCUtil类 工具类

jdbcutil 主要处理的是 连接数据库, 和关闭各个流 1, 数据库连接的配置信息: mysql.properties (在工程的目录下)个人配置 urljdbc:mysql://localhost:3306/test drivercom.mysql.jdbc.Driver usernameroot password123 2, 获取连…

1.关于python

开始时间:2018年12月6日19:13:24 python第一次接触,将学习《简明python3教程》这本书,顺便做下笔记。 ----------------------------------------------------------------------------------------------------- 1、python的特点&#xf…

mybatis 使用in 查询时报错_MyBatis(四):mybatis中使用in查询时的注意事项

packagecom.boco.jobmonitor.model;importjava.util.Date;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;public classJobitem {/*** 唯一键 pk* 列名:id 类型:INTEGER(10) 允许空:false 缺省值:null*/IdGenerat…

python网络聊天器多线程版

在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器。 说明: 编写一个有2个线程的程序线程1用来接收数…

CentOS 7 / RHEL 7 systemd 指令

CentOS 7 已经切换到 systemd,系统指令也有所变化。之前用于启动、重启、停止各种服务的service 作为向后兼容的指令还能使用,但是将来可能会消失。同时,chkconfig 也改成了systemctl 了。这里列举了一些常用的对应于 service 和 chkconfig 的…

隔离域逻辑

在一个设计模式类中,我对建模域逻辑进行了有趣的讨论。 具体来说,它与隔离域逻辑有关 。 应用程序通常分为三个部分: 演示(例如桌面GUI,浏览器,Web服务) 域逻辑 基础架构(例如持久…

2.基础

时间:2018年12月7日18:45:59 ----------------------------------------------------------------------------------- 1.字面常量:指数字或文本字符串,值不能被改变 (1)数字:整数,浮点数&…

vsco怎么两个滤镜叠加_PS插件 VSCO滤镜137款预设安装使用教程

文末获取资源VSCO是大名鼎鼎的手机滤镜,以其逼真的胶片文艺复古风爆红,vsco滤镜甚至被誉为照片调色界的业界良心(没有之一)。不过vsco滤镜虽然很好用但苦于一直没有电脑版本,许多摄影爱好者还会用手机调色后放进PS精修。VSCO面板可以在PS上完…

Tensorflow笔记(一)

1.交叉熵 在tensorflow中用:tf.nn.sigmoid_cross_entropy_with_logits()来表示跟sigmoid搭配使用的交叉熵。tf.nn.softmax_cross_entropy_with_logits()来表示跟softmax搭配使用的交叉熵。转载于:https://www.cnblogs.com/fzth-gfh/p/10123182.html

甘特图 知乎_如何使用 Excel 绘制甘特图?

————看了上面几张甘特图,基本上只实现了『计划』和『百分比进度』这两个概念,只有在理想化的一切按照计划发展的情况下才有参考价值。但是实际上执行会提前、也可能延期,进度实时都可能变更,我们应该分开考虑计划图和进度图的…

Kali 2.0 采用ssh连接登陆

Kali GNU/Linux 2.0 \n \l 安装完kali2.0 采用ssh远程连接尽然会出现“无法连接”的情况,下面就此情况来解决问题 第一步:编辑ssh配置文件 rootrslinux:~# vim /etc/ssh/sshd_config 第二步:重新启动ssh服务 rootrslinux:~# /etc/init.d/ssh …

3.运算符与表达式,控制流

时间:2018年12月8日14:56:25 -------------------------------------------------------------------------------------------- 表达式包括运算符与操作数 1、运算符 2、求值顺序 控制流(3种) 1、if语句 number 23 guess int(input…

英语口语练习系列-C37-服饰-询问年龄-沁园春-长沙

服饰 clothes or jewelryyour favorite clothes or jewelryjewelrynecklacebraceletearringsgolddiamondbeadbroochbanglecrystalfashionfashionablesuittrendstylishboutiqueuniquepersonalityinterestuniformoccupationindividualitycasual wearcomfortable clothestradition…

因此,甲骨文杀死了java.net

好吧,还没有……但是他们宣布要在2017年5月之前关闭java.net和 kenai。JohnK . Waters 在ADTmag的Kenai和java.net的“日落”一文中接受了我的采访。 由于Oracle几乎没有提供有关已经托管在java.net上的关键项目会发生什么情况的信息,因此本文中编写的大…

snmp的使用

freebsd7.1安装snmp cd /usr/ports/net-mgmt/net-snmp make make install net-snmp相关资料 http://www.net-snmp.cn/ Snmp分2种角色:SNMP管理站(manager,我们的本机127.0.0.1)和SNMP代理(agent,我们…

1个ieee1394端口_请问IEEE1394端口有什么作用?

匿名用户1级2007-07-31 回答IEEE1394标准是一种非专用的、高速的串行总线输入输出标准。它提供了一种连接数字设备的方法,包括个人计算机和用户电子硬件。它独立于平台,可以升级(可扩展),并在支持对等连接方面很灵活。IEEE1394标准无需将数字…

jsoup 获取html中body内容_Java 进阶 利用Jsoup获取HTML页面的各分页中的标题信息...

简单介绍一下JsoupJsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于Xpath,jQuery的操作方法来取出和操作元素和数据。使用Jsoup,需要导入Jsoup所需Jar包&a…