同步器

Java高并发编程---队列同步器

淺唱寂寞╮ 提交于 2019-11-30 09:30:49
同步队列  同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。  同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前驱和后继节点。 节点的属性类型与名称以及描述如下  节点是构成同步队列的基础,同步器拥有首节点(head)和尾节点(tail),没有成功获取同步状态的线程将会成为节点加入该队列的尾部。同步队列遵循FIFO,首节点是获取同步状态成功的节点,首节点的线程在释放同步状态时,将会唤醒后继节点,而后继节点将会在获取同步状态成功时将自己设置为首节点。 同步队列结构  同步器包含了两个节点类型的引用,一个指向头节点,而另一个指向尾节点。   独占式同步状态获取与释放  通过调用同步器的acquire(int arg)方法可以获取同步状态,该方法对中断不敏感,也就是由于线程获取同步状态失败后进入同步队列中,后续对线程进行中断操作时,线程不会从同步队列中移出。 同步器的acquire方法 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued

聊聊并发(十三)—AQS框架深入分析

若如初见. 提交于 2019-11-29 23:41:09
#0 系列目录# 并发系列 聊聊并发(一)深入分析Volatile的实现原理 聊聊并发(二)Java SE1.6中的Synchronized 聊聊并发(三)Java线程池的分析和使用 聊聊并发(四)深入分析ConcurrentHashMap 聊聊并发(五)原子操作的实现原理 聊聊并发(六)ConcurrentLinkedQueue的实现原理分析 聊聊并发(七)Java中的阻塞队列 聊聊并发(八)Fork/Join框架介绍 聊聊并发(九)Java中的Copy-On-Write容器 聊聊并发(十)生产者消费者模式 [聊聊并发(十一)—CAS原理] 聊聊并发(十二)—AQS分析 聊聊并发(十三)—AQS框架深入分析 [聊聊并发(十四)—Atomic类] [聊聊并发(十五)—MVCC多版本并发控制] #1 什么是同步器# 多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。 这个共同的语义可以称之为 同步器 。可以认为所有的锁机制都可以 基于同步器定制来实现的 。 而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。 juc 里所有的这些锁机制都是基于 AQS ( AbstractQueuedSynchronizer )框架上构建的 。下面简单介绍下 AQS(

Java并发编程知识点总结Volatile、Synchronized、Lock实现原理

允我心安 提交于 2019-11-28 20:40:53
Volatile 关键字及其实现原理   在多线程并发编程中, Volatile 可以理解为轻量级的 Synchronized ,用 volatile 关键字声明的变量,叫做共享变量,其保证了变量的“可见性”以及“有序性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。可见性是由 Java 内存模型保证的(底层还是通过内存屏障实现的),即某个线程改变共享变量的值之后,会立即同步到主内存,线程每次使用共享变量的时候都先从内存中读取刷新它的值;而有序性是通过“内存屏障”实现的,通过禁止指令重排序,从而使得某些代码能以一定的顺序执行。   但是 Volatile 关键字不能保证对共享变量操作的“原子性”,比如自增操作( i++ )就不是原子操作,其可以分解为:①从内存中读取 i 的值,②对 i 进行自增操作,③将 i 的值写入到内存中;因此 volatile 关键字也不能完全保证多线程下的安全性。   在了解 volatile 关键字的原理之前,首先来看一下与其实现原理相关的 CPU 术语与说明。 图 1. 与 volatile 实现原理相关的相关 CPU 术语与说明   通过对声明了 volatile 变量的 Java 语句进行反编译可以发现,有 volatile 变量修饰的共享变量进行写操作的时候会多出第二行汇编代码, 其中 Lock

多线程与高并发(六) Lock

只愿长相守 提交于 2019-11-28 07:13:59
之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。 不同于synchronized是Java语言的关键字,是内置特性,Lock不是Java语言内置的,Lock是一个类,通过这个类可以实现同步访问。而且synchronized同步块执行完成或者遇到异常是锁会自动释放,而lock必须调用unlock()方法释放锁,因此在finally块中释放锁。 一、 Lock 接口 先看看lock接口定义了哪些方法: void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition();

AQS

痞子三分冷 提交于 2019-11-27 02:32:42
文章目录 介绍 原理 AQS 原理概览 AQS 对资源的共享方式 AQS底层使用了模板方法模式 AQS 组件总结 介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。 AQS是一个 用来构建锁和同步器的框架 ,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己需求的同步器。 原理 AQS 原理概览 AQS核心思想是, 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态 。 如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制 ,这个机制AQS是用 CLH队列锁 实现的,即 将暂时获取不到锁的线程加入到队列 中。 CLH (Craig,Landin,and Hagersten)队列是一个 虚拟的双向队列 (虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。

ntp服务搭建(时间同步器)

被刻印的时光 ゝ 提交于 2019-11-26 14:24:29
搭建ntp服务 准备环境: 服务端 192.168.124.117 客户端 192.168.124.109 服务端配置: yum install ntp ntpdate -y 备份配置文件 cp /etc/ntp.conf /etc/ntp.conf.bak 编辑配置文件 vim /etc/ntp.conf 在里面 将#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap前面的注释去掉 再在下面添加一行 server 192.168.124.117(服务端Ip) 启动服务 service ntpd start 关闭防火墙 systemctl stop firewalld setenforce 0 客户端配置 下载 yum install ntp ntpdate -y 2.编辑文件 vim /etc/ntp.conf 在里面添加 server 192.168.124.109(客户端Ip) 关闭防火墙 systemctl stop firewalld setenforce 0 实现同步 ntpdate 192.168.124.117(服务端ip) 来源: https://blog.51cto.com/14354119/2427880

亚稳态与同步器

橙三吉。 提交于 2019-11-26 10:29:07
亚稳态是由于违背触发器的建立保持时间产生的,一般来说,触发器都会在一个或者两个时钟周期内从亚稳态返回稳态。 亚稳态窗口(Metastability Window)具有特定的时间长度,这段时间内输入信号和时钟都应该保持不变,如果它们发生变化,输出可能变成亚稳态,建立时间和保持时间共同决定了亚稳态窗口的宽度。 亚稳态出现的条件通常有 输入信号是异步信号。 时钟偏移/摆动(上升/下降时间)高于容限值。 信号跨时钟域(包括跨同频不同相的时钟域)。 组合逻辑延时使数据在触发器的亚稳态窗口发生变化。 系统时钟频率过高。 关于亚稳态的建议 在两个异步系统的交界处亚稳态是不可避免的,但使用以下方法可以减少亚稳态的发生概率 采用同步器。 避免使用dV/dt低的输入信号。 采用相应更快的触发器(缩短亚稳态窗口)。 减少组合逻辑的延时。 降低时钟频率。 亚稳态监测电路 同步器 模式A (T async_in > T clk) 模式B (T async_in < T clk) 以上内容摘自 The Art of Hardware Architecture. 来源: https://blog.csdn.net/yhs18200259681/article/details/98785036