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

java名 java_Java Syncrhonisers相关推荐

  1. 命名空间和工程名java_Java的类装载器(Class Loader)和命名空间(NameSpace)

    正文 Java中类的查找与装载出现的问题总是会时不时出现在Java程序员面前,这并不是什么丢脸的事情,相信没有一个Java程序员没遇到过ClassNotException,因此不要为被人瞅见自己也犯这 ...

  2. php 解析java map,java_java遍历Map的几种方法分析,本文实例分析了java遍历Map的几 - phpStudy...

    java遍历Map的几种方法分析 本文实例分析了java遍历Map的几种方法.分享给大家供大家参考,具体如下: Java代码: Map map=new HashMap(); map.put(" ...

  3. sorl java 建索引_solr 的客户端调用solrj 建索引+分页查询

    在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了! 一.利用SolrJ操作solr API 使用SolrJ操作Solr ...

  4. cobol to java_cobol to java

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 (a) Javaソースプログラムの作成 COBOLプログラムを呼び出すJavaプログラムでは,次の三つのJavaソースファイルを作成する必要があります. ...

  5. java语言发展史,虚拟机的安装与配置

    1.  计算机基础 1.1. 计算机 电子计算机,俗称电脑,是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机. 1.2. 硬件和 ...

  6. 计算机基础与java简介

    1.计算机基础 1.1.计算机 电子计算机,俗称电脑,是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机. 1.2.硬件和软件 1 ...

  7. Java第一天 java环境搭建和Java下载

    环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如path,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path ...

  8. java se系列(一)开发前奏

    1. 软硬件知识 电子计算机:俗称电脑,是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机 cpu:是一台计算机的运算核心和控制核 ...

  9. Apache Solr schema.xml及solrconfig.xml文件中文注解

    一.字段配置(schema) schema.xml位于solr/conf/目录下,类似于数据表配置文件, 定义了加入索引的数据的数据类型,主要包括type.fields和其他的一些缺省设置. 1.先来 ...

最新文章

  1. OpenCV编译viz模块
  2. Java Web 前端高性能优化(一)
  3. linux之杀死某个应用或命令的一行终极命令
  4. P6113-[模板]一般图最大匹配【带花树】
  5. Android如何分析native代码,使用android-ndk-profiler对native代码进行性能分析
  6. nodejs与javascript中的aes加密
  7. Keyerror ‘acc‘ KeyError: ‘val_acc‘解决方法
  8. python jupyter
  9. Studio 3T for MongoDB 激活破解脚本
  10. hunnu 10246 最大间隙问题 桶排序+抽屉原理
  11. [Excel知识技能] 将文本型数字转换为数值格式
  12. Mybatis| Bug合集
  13. linux日常常用命令介绍——实用、简单明了不啰嗦
  14. OSChina 周一乱弹 —— 把这个赚钱的办法写到刑法里
  15. Stata画出数据的时间序列折线图和拟合趋势线
  16. vscode插件不兼容无法安装
  17. 2019年安徽省大学生网络攻防赛赛前培训——Day2
  18. IDEA中springboot项目@SpringBootApplication飘红问题的奇葩解决方案
  19. java 文档处理界面_java – 如何设置Word文档的页面方向?
  20. Autosar DaVinci Developer的一些基本功能

热门文章

  1. YBTOJ危桥通行洛谷P3163:危桥通行(网络流)
  2. bzoj4589-Hard Nim【FWT】
  3. P3466-[POI2008]KLO-Building blocks【Treap】
  4. jzoj3236-矮人排队【权值线段树】
  5. POJ2482-Stars in Your Window【线段树,扫描线,离散化】
  6. 泰勒及洛朗展开学习笔记
  7. 【DP】花店橱窗布置 (ssl 1626/luogu 1854)
  8. MySQL sysdate()函数
  9. Vue.js2.0开发环境搭建(四)
  10. JavaFX将Node导出为图片