java名 java_Java Syncrhonisers

java名 java

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

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

在本文中,我们将探讨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

java名 java

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

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

相关文章

leetcode(二分查找算法专题)

二分模板一共有两个,分别适用于不同情况。 算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l r时,我们就找到了目标值。 * 其中mid需要在while内部进行更新 * 最小R,最大L , R来加&…

html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...

LOL手游上线已经有一段时间了,虽然绝大多数情况下LOL端游的内容被继承到了手游当中,但是仍然有一部分端游的内容尚未出现在手游之内。今天小编就带领大家来盘点一下,那些未来可能出现在手游当中的端游内容。排位赛ban选英雄机制Moba游戏排位赛…

因此,Oracle杀死了java.net

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

【Python科学计算系列】概率论与数理统计

计算排列数 def arrangement(n, m):if n m:return math.factorial(n)else:return math.factorial(n) / math.factorial(n - m) 计算组合数 def arrangement(n, m):return math.factorial(n) / (math.factorial(m) * math.factorial(n - m))

proc编译手册_Expect 手册 中文版

Expect 手册 中文版本文由gunman翻译,在此感谢~EXPECT(1)名字:Expect-----能与交互式程序进行“可程序化”会话的脚本语言大纲:(命令选项概述)expect [ -dDinN ] [ -c cmds ] [ -[f|b] ] cmdfile ] [ args ]概述:Expec…

光盘 机密_使用保险柜管理机密

光盘 机密您如何存储秘密? 密码,API密钥,安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置,不得以纯文本格式提供。 实际上,不得在任何位置以明文形式存储它。 可以使用Spring Cloud Confi…

OS X下使用OpenGL做离屏渲染

本文为转载内容,原地址 有时,我们想通过GPU做一些视频、图像处理,而处理的结果不需要显示在显示器上,而是直接交给主存,这时候我们可以通过OpenGL的离屏渲染来实现。 由于我们不需要将渲染好的像素显示到屏幕上&…

jpa 循环引用_JPA中按身份引用

jpa 循环引用在上一篇文章中 ,我提到我选择通过其主键而不是类型来引用其他聚合。 在处理大型或复杂域模型时,我通常使用这种方法(也称为断开域模型)。 在本文中,让我尝试进一步解释如何在JPA中完成它。 请注意&#x…

自然辩证法小论文选题_自然辨证法论文题目

与《自然辨证法论文题目》相关的范文2010年研究生课程论文 成绩: 题目:_中西医结合的发展前景_ _ 中西医结合的发展前景 [摘要]立足于中西医结合的现状,从方法论角度,就中西医融合的时间进行了探讨.中西医结合,是在我国既有传统的中医药学,又有现代的西医药学的特定环境和条件下…

Leetcode 14.最长公共前缀

原题链接 解题思路: 1.本题使用模拟法 2.取第一个字符串的首元素,与剩余字符串对应位置相比较,如果全部相等将此字符加入结果中,继续到下一个字符一次比较,直至出现不相同的位置,返回结果。 3.需要注意每个字符串是…

aws lambda_带有API网关的AWS Lambda

aws lambda在上一篇文章中,我向您展示了如何创建和部署AWS Lambda。 我们将继续这项工作,并只考虑更新该lambda的代码。 我们还将使用AWS API Gateway将REST端点添加到AWS Lambda。 因此,在继续之前……(如果还没有)&…

git pull不同步_git回退版本,再返回最新分支git pull失败的解决经验

本文转载自【微信公众号:羽林君,ID:Conscience_Remains】总述一篇解决gti分支切换问题的文章,大家应该都有过这种情况,就是git最新的代码进行编译的时候,发现最新代码有bug,有些不确认问题点&am…

junit5 动态测试_JUnit 5 –动态测试

junit5 动态测试在定义测试时,JUnit 4有一个很大的弱点:它必须在编译时发生。 现在,JUnit 5将解决此问题! Milestone 1 刚刚发布 ,它带有全新的动态测试,可以在运行时创建测试。 总览 本系列中有关JUnit 5…

ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程

0. Ioc主要是实现一个控制反转,耦合性大大降低。1. 建maven项目建立一个空的maven项目,然后pom.xml添加spring-context的依赖:org.springframeworkspring-context5.2.7.RELEASE2. 创建pojo java对象package com.aca;public class Hello {private String …

C++ 11 深度学习(十)原始字面量

你是否曾经为了各种json格式无法写入string中而烦恼,为了各种转义而烦恼。如下图 c11为我们带来了全新的解决方法 其新特性为使用. R"(xxxxxxxxxxxx)" ,此种形式可以使得以原有形式进行表现出来

java日期时间转日期_Java时间和日期指南

java日期时间转日期长期以来,正确处理日期,时间,时区,夏令时,and年等一直是我的烦恼。 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem&#xff…

linux过滤端口抓包_Linux抓包工具tcpdump使用总结,WireShark的过滤用法

tcpdump与WireShark是Linux下的两个常用,功能强大的抓包工具,下面列出这两个工具的简单用法。tcpdump用法tcpdump用法:sudo tcpdump -i ens33 src 192.168.0.19 port 80 -xx -Xs 0 -w test.capsudo tcpdump -i ens33 src port 80 -xx -Xs 0 -…

C++ 11 深度学习(十一)final和override

1. final C 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写,和 Jave 的 final 关键字的功能是类似的。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。 1.1 修饰函数…

交流伺服系统设计指南_交流设计

交流伺服系统设计指南软件设计至关重要。 它是应用程序的基础。 就像蓝图一样,它为所有背景的聚会提供了一个通用平台。 它有助于理解,协作和发展。 设计不应仅视为开发的要素。 它不应该仅仅存在于开发人员的脑海中,否则团队将发现它几乎无…