CAS

Java都有哪几种锁

落花浮王杯 提交于 2020-04-12 09:17:35
一、公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁。 二、可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。 对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。 synchronized void setA() throws Exception{ Thread.sleep(1000); setB(); } synchronized void setB() throws Exception{ Thread.sleep(1000); } 上面的代码就是一个可重入锁的一个特点

什么是云容灾?它与传统数据备份有什么不同?

核能气质少年 提交于 2020-04-11 16:35:18
一、什么是云容灾? 云容灾,也叫做云灾备(英文名:Cloud DRaaS)是以云服务的方式为企业提供提供数据容灾备份服务,企业无需投入大量时间、人力、资源成本,具有即开即用,按需付费,弹性扩容,方便管理等特点。 二、而传统数据备份:指数据备份的介质从磁带发展到虚拟带库、备份一体机,或是利用传统备份软件,但备份数据的备份格式没有任何改变。传统方式的数据管理已经不能满足许多企业的数据恢复和保护的需要。从企业的角度,花在数据保护上的高昂费用,面对越来越高的行业数据存储规范标准,传统的保存模式已经显得越来越木讷了。 1、传统数据备份直接从生产环境中通过磁带备份连续写入的方式,显然难以应对数据量激增给IT环境带来的超负荷处理挑战,其效率的不足使其“吃力”表现愈加明显。海量数据卷导致备份时间延长,企业往往不得不采用人工或复杂的快照和脚本方法,这使得恢复操作极其复杂、耗时:陈旧的备份方法、笨拙的人工方式,漫长的等待。 2、传统数据备份方式显然难以满足现金规模较大的超负荷的处理压力,低下的效率,使得工作的表现越来越差。以及其远古的人工管理,漫长的周期都使得工作复杂话。说得具体一点,不足之处是:在规定的时间内,企业无法完成备份的工作,处理工程中需要很高的设备要求和功耗。制约了新兴起的“云”技术的发展。完全的分层存储无法实现。 3、传统数据备份更加严重的是,传统方法无法应对数据的快速增长

免费云灾备介绍

时光总嘲笑我的痴心妄想 提交于 2020-04-11 15:07:05
企业的数据库就好比人的大脑的记忆系统,没有了数据库就没有了记忆系统。但是数据的安全性不是万无一失的, 随着企业信息化的发展,对于核心数据的安全需求也就越来越大,数据容灾备份就是为了在遭遇灾害时能保证信息系统能正常运行,帮助企业实现业务连续性的目标,备份是为了应对灾难来临时造成的数据丢失问题。 数据容灾备份很多人不知道,实际上是两个概念。容灾是一个系统工程,而备份和恢复就是这一系统的组成部分,除了这之外,还有许多具体的工作,如备份媒体的保管、存放,容灾演练等都是容灾中要做的。 同时,数据容灾备份根据不同的需要会分为不同的等级。根据数据容灾系统对灾难的抵抗程度,可分为数据容灾和应用容灾。 数据容灾是指建立一个异地的数据系统,该系统是对本地系统关键应用数据实时复制。当出现灾难时,可由异地系统迅速接替本地系统而保证业务的连续性。应用容灾比数据容灾层次更高,即在异地建立一套完整的、与本地数据系统相当的备份应用系统(可以同本地应用系统互为备份,也可与本地应用系统共同工作)。在灾难出现后,远程应用系统迅速接管或承担本地应用系统的业务运行。设计一个容灾备份系统,需要考虑多方面的因素,如备份/恢复数据量大小、应用数据中心和备援数据中心之间的距离和数据传输方式、灾难发生时所要求的恢复速度、备援中心的管理及投入资金等。 基于云计算技术,灾难恢复系统的成本低,恢复速度快。未来

深入学习Lock锁(4)——读写锁ReadWriteLock接口

与世无争的帅哥 提交于 2020-04-11 13:32:08
1.简介 如ReentrantLock都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而 读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞 。 读写锁维护了一对锁,一个读锁和一个写锁 ,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。 在没有读写锁之前,只能通过Java的等待通知机制,就是当写操作开始时,所有晚于写操作的读操作均会进入等待状态,只有写操作完成并进行通知之后,所有等待的读操作才能继续执行(写操作之间依靠synchronized关键进行同步),这样做的目的是使读操作能读取到正确的数据,不会出现脏读。改用读写锁实现上述功能,只需要在读操作时获取读锁,写操作时获取写锁即可。当写锁被获取到时,后续(非当前写 操作线程)的读写操作都会被阻塞,写锁释放之后,所有操作继续执行。 Java并发包提供读写锁接口ReadWriteLock的实现是 ReentrantReadWriteLock。其具有的特性包括: 公平性选择:支持非公平和公平的获取锁方式。但非公平的吞吐量大于公平的。 重入锁:支持重入锁,即获取读锁之后还能再次获取读锁,获取写锁后还能再次获取读锁或写锁。 锁降级:允许获取写锁,获取读锁,释放写锁的次序,即写锁可以降级为读锁。 2.读写锁的接口与示例 1. ReentrantReadWriteLock相关API

java.util.concurrent.locks.ReentrantReadWriteLock 源码

自古美人都是妖i 提交于 2020-04-11 11:52:49
相关类图: ReentrantReadWriteLock 实现了 ReadWriteLock 接口。其自身有五个内部类,五个内部类之间也是相互关联的。内部类的关系如下图所示。 如上图所示,Sync继承自AQS、NonfairSync继承自Sync类、FairSync继承自Sync类;ReadLock实现了 Lock 接口、WriteLock也实现了 Lock 接口。 java.util.concurrent.locks. ReentrantReadWriteLock 源码: package java.util.concurrent.locks; import java.util.concurrent.TimeUnit; import java.util.Collection; public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable { private static final long serialVersionUID = -6992448646407690164L;// 版本序列号 // 读锁 private final ReentrantReadWriteLock.ReadLock readerLock; // 写锁 private final

线程之Synchronized基本内容

霸气de小男生 提交于 2020-04-11 10:54:19
1.Synchronized关键字 1. 定义 Java 中的1个关键字 2. 作用 保证同一时刻最多只有1个线程执行。被 Synchronized 修饰的方法 / 代码,其他线程 必须等待当前线程执行完该方法 / 代码块后才能执行该方法 / 代码块。 3. 应用场景 保证线程安全,解决多线程中的并发同步问题(实现的是阻塞型并发) ,具体场景如下: 修饰 实例方法 / 代码块时,(同步)保护的是同一个对象方法的调用 & 当前实例对象 修饰 静态方法 / 代码块时,(同步)保护的是 静态方法的调用 & class 类对象 4. 原理 依赖 JVM 实现同步 底层通过一个 监视器对象 (monitor) 完成, wait() 、 notify() 等方法也依赖于 monitor 对象。 监视器锁(monitor)本质 依赖于 底层操作系统的互斥锁(Mutex Lock)实现 5. 具体使用 Synchronized 用于 修饰 代码块、类的实例方法 & 静态方法 5.1 使用规则 5.2 锁的类型 & 等级 由于 Synchronized 会修饰 代码块、类的实例方法 & 静态方法,故分为不同锁的类型 具体如下 示意图 之间的区别 示意图 5.3 使用方式 /** * 对象锁 */ public class Test { // 对象锁:形式1(方法锁) public

聊聊 Java 的几把 JVM 级锁

我的梦境 提交于 2020-04-10 17:26:35
Photo @ zibik 文 | 楚昭 简介 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CPU 从单核到了多核,缓存性能也得到了很大提升,尤其是多核 CPU 技术的到来,计算机同一时刻可以处理多个任务。在硬件层面的发展带来的效率极大提升中,软件层面的多线程编程已经成为必然趋势,然而多线程编程就会引入数据安全性问题,有矛必有盾,于是发明了“锁”来解决线程安全问题。在这篇文章中,总结了 Java 中几把经典的 JVM 级别的锁。 synchronized synchronized 关键字是一把经典的锁,也是我们平时用得最多的。在 JDK1.6 之前, syncronized 是一把重量级的锁,不过随着 JDK 的升级,也在对它进行不断的优化,如今它变得不那么重了,甚至在某些场景下,它的性能反而优于轻量级锁。在加了 syncronized 关键字的方法、代码块中,一次只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。 synchronized 锁有如下几个特点: 有锁升级过程 在 JDK1.5 (含)之前, synchronized 的底层实现是重量级的,所以之前一致称呼它为"重量级锁",在 JDK1.5 之后,对 synchronized 进行了各种优化,它变得不那么重了,实现原理就是锁升级的过程。我们先聊聊 1

并发——抽象队列同步器AQS的实现原理

我只是一个虾纸丫 提交于 2020-04-10 09:32:41
一、前言   这段时间在研究 Java 并发相关的内容,一段时间下来算是小有收获了。 ReentrantLock 是 Java 并发中的重要部分,所以也是我的首要研究对象,在学习它的过程中,我发现它是基于 抽象队列同步器AQS 实现的,所以我花了点时间学习了一下 AQS 的实现原理。这篇博客就来说一说 AQS 的作用,以及它是如何实现的。 二、正文 2.1 什么是AQS    AQS 全称抽象队列同步器(AbstractQuenedSynchronizer),它是一个可以用来实现线程同步的基础框架。当然,它不是我们理解的 Spring 这种框架,它是一个类,类名就是 AbstractQuenedSynchronizer ,如果我们想要实现一个能够完成线程同步的锁或者类似的同步组件,就可以在使用 AQS 来实现,因为它封装了线程同步的方式,我们在自己的类中使用它,就可以很方便的实现一个我们自己的锁。 2.2 如何使用AQS    AQS 封装了很多方法,如获取独占锁,释放独占锁,获取共享锁,释放共享锁......我们可以通过在自己的实现的同步组件中调用 AQS 的这些方法来实现一个线程同步的功能。但是,根据 AQS 的名称也能够想到,我们不能直接创建 AQS 的对象,调用这些方法,因为 AQS 是一个抽象类,我们需要继承 AQS ,创建它的子类对象来使用它。在实际使用中

免费高速云备份-免费云灾备

主宰稳场 提交于 2020-04-10 07:28:27
免费高速云备份 云备份是通过集群应用、网格技术或分布式文件系统等功能,将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储备份和业务访问的功能服务。 提到数据云备份,首先考虑的是数据安全。云备份一般是内部进行备份!比如学校,医院,政府部门,企事业单位,通过内部资源整合,通过备份软件来建立自己的私有云!建立私有云要考虑到以下几点: 首先是整合硬件。“服务器的数量天天都在变化,没有一个准确数量,我们是统一管理,所以有必要进行整合。”另外,要给学校的各项服务提供一个坚实的底层支持,“类似数字图书馆、一卡通之类的服务必须依靠网络中心,一点问题也不能出。 云技术是发展潮流,追逐云计算也算是顺应潮流! 对于存储,主要看重存储的写和备份过程,也许服务器硬盘总容量接近150T,但是能有效使用的存储连10T都不到,非常分散,而且各自为政,如果不用云的理念将之结合,存储永远不够用。另外众多单位部门没有正式做备份,这也是很危险的一件事。 2 云备份优点 可扩展节约成本 企业使用云备份后,可以依靠第三方云提供商的无限扩展能力,而不需担心投资问题。事实上,边使用边付费的模式减少了备份的采购和实施带来的烦恼。这种方式使得我们能够预测并管理容量增长和运营费用。 高效可靠 云提供商通常会提供最先进的技术,比如基于磁盘的备份、压缩、加密、重复数据删除、服务器虚拟化、存储虚拟化

被面试官吊打系列之JUC之 可重入读写锁ReentrantReadWriteLock 之 源码详尽分析

会有一股神秘感。 提交于 2020-04-09 12:55:25
可重入读写锁 ReentrantReadWriteLock 其实基本上模拟了文件的读写锁操作。ReentrantReadWriteLock 和ReentrantLock 的差别还是蛮大的; 但是也有很多的相似之处; ReentrantReadWriteLock 的 writerLock 其实就是相当于ReentrantLock,但是它提供更多的细腻的控制;理解什么是读锁、写锁非常重要,虽然实际工作中区分读写锁这样的细分使用场景比较少。 ReentrantReadWriteLock 把锁进行了细化,分为了两种: 读锁和写锁。它们之间有一些限制关系:   读 写 读 Y N 写 N N 其中: Y 表示共享,N表示排斥(即独占) 具体分析如下 : /* * ReadWriteLock的一个实现,支持类似于ReentrantLock的语义。 这个类有以下属性: 1 获取顺序 该类不为锁访问强加读线程、写线程优先顺序。但是,它确实支持一个可选的公平策略。 2 非公平模式(默认 当构造为非公平锁(默认情况下)时,读写锁的进入顺序是不指定的,受重入限制。持续争夺的非公平锁可能会无限期推迟一个或多个读写线程,但通常会比公平锁的吞吐量更高。 3 公平模式 当构造为公平时,线程使用大约到达顺序策略争夺进入。当当前持有的锁被释放时,等待时间最长的单个写线程将被分配到写锁