对象存储

JVM中锁优化简介

两盒软妹~` 提交于 2019-12-16 09:41:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文将简单介绍HotSpot虚拟机中用到的锁优化技术。 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。而在很多应用上,共享数据的锁定状态只会持续很短的一段时间。若实体机上有多个处理器,能让两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程原地自旋(不放弃CPU时间),看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只须让线程执行一个忙循环(自旋),这项技术就是自旋锁。 如果锁长时间被占用,则浪费处理器资源,因此自旋等待的时间必须要有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统的方式去挂起线程了(默认10次)。 JDK1.6引入自适应的自旋锁:自旋时间不再固定,由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。 锁削除 锁削除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除(主要判定依据来源于逃逸分析的数据支持,如果判断到一段代码中

Synchronized原理分析

社会主义新天地 提交于 2019-12-16 00:13:20
文章简介 synchronized想必大家都不陌生,用来解决线程安全问题的利器。同时也是Java高级程序员面试比较常见的面试题。这篇文正会带大家彻底了解synchronized的实现。 内容导航 什么时候需要用Synchronized synchronized的使用 synchronized的实现原理分析 什么时候需要用Synchronized 想必大家对synchronized都不陌生,主要作用是在多个线程操作共享数据的时候,保证对共享数据访问的线程安全性。 比如在下面这个图片中,两个线程对于i这个共享变量同时做i++递增操作,那么这个时候对于i这个值来说就存在一个不确定性,也就是说理论上i的值应该是2,但是也可能是1。而导致这个问题的原因是线程并行执行i++操作并不是原子的,存在线程安全问题。所以通常来说解决办法是通过加锁来实现线程的串行执行,而synchronized就是java中锁的实现的关键字。 synchronized在并发编程中是一个非常重要的角色,在JDK1.6之前,它是一个重量级锁的角色,但是在JDK1.6之后对synchronized做了优化,优化以后性能有了较大的提升(这块会在后面做详细的分析)。 先来看一下synchronized的使用 Synchronized的使用 synchronized有三种使用方法,这三种使用方法分别对应三种不同的作用域,代码如下

80道最新java基础部分面试题(六)

大憨熊 提交于 2019-12-15 18:04:46
自己整理的面试题,希望可以帮到大家,需要更多资料的可以私信我哦,大家一起学习进步! 59、ArrayList和Vector的区别 答: 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。 接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的

Ceph组件

牧云@^-^@ 提交于 2019-12-15 16:16:18
Ceph组件 RADOS(Reliable Autonomic Distributed Object Store) RADOS是Ceph 存储集群的基础。Ceph 中的一切都以对象的形式存储,而RADOS 就负责存储这些对象,而不考虑它们的数据类型。RADOS 层确保数据一致性和可靠性。对于数据一致性,它执行数据复制、故障检测和恢复。还包括数据在集群节点间的recovery。 OSD 实际存储数据的进程。通常一个OSD daemon绑定一个物理磁盘。Client write/read 数据最终都会走到OSD去执行write/read操作。 MON(monitor) Monitor在Ceph集群中扮演者管理者的角色,维护了整个集群的状态,是Ceph集群中最重要的组件。 Mon保证集群的相关组件在同一时刻能够达成一致,相当于集群的领导层,负责收集、更新和发布集群信息。为了规避单点故障,在实际的Ceph部署环境中会部署多个Mon,同样会引来多个Mon之前如何协同工作的问题。 LIbrados 简化访问RADOS的一种方法,目前支持PHP、Ruby、Java、Python、C和C++语言。它提供了Ceph 存储集群的一个本地接口RADOS ,并且是其他服务(如RBD 、RGW) 的基础,以及为CephFS 提供POSIX 接口。librados API 支持直接访问RADOS

OpenGL ES入门之顶点缓冲区对象相关

天大地大妈咪最大 提交于 2019-12-15 04:03:20
顶点属性的概念、如何指定它们和它们支持的数据格式、如何绑定顶点属性以用于顶点着色器、在OpenGL ES 3.0中用顶点属性绘制图元的方法 顶点属性 顶点属性:顶点数据,指定每个顶点的数据,这种逐顶点可以为每个顶点指定,也可用于所有顶点的常量,例如一个纯色三角形具有固定颜色的顶点和逐顶点位置属性。 所有OpenGL ES 3.0实现必须支持最少16个顶点属性,可以通过 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, maxVertexAttribs, 0); 查询支持的顶点属性数量 常量顶点属性:对于一个图元的所有顶点只需指定一个值,glVertexAttrib*命令用于加载index(通用顶点属性索引)指定的顶点属性 顶底数组指定每个顶点的属性,是保存在应用程序地址空间的缓冲区,是顶点缓冲对象的基础,提供指定顶点属性数据的一种高效灵活的手段,顶点数组常使用glVertexAttribPointer函数指定,对于该函数最后一个参数,如果使用的顶点数组保存顶点数据,则存放顶点数组名,如果使用顶点缓冲区对象,则存放该缓冲区内的偏移量;对于使用glVertexAttribPointer函数指定顶点数组的程序,需在调用glDraw 方法前,对属性调用glEnableVertexAttribArray()方法进行使能启用,同时调用glDraw

深入剖析HashMap应用原理

霸气de小男生 提交于 2019-12-14 22:08:21
Hashing(散列法或哈希法)的概念 散列法(Hashing)是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。 HashMap概念和底层结构 HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap储存的是键值对,HashMap很快。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 数组:存储区间连续,占用内存严重,寻址容易,插入删除困难; 链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易; Hashmap综合应用了这两种数据结构,实现了寻址容易,插入删除也容易。 hashMap的结构示意图如下: HashMap的基本存储原理以及存储内容的组成 基本原理:先声明一个下标范围比较大的数组来存储元素。另外设计一个哈希函数(也叫做散列函数)来获得每一个元素的Key(关键字)的函数值(即数组下标,hash值)相对应,数组存储的元素是一个Entry类,这个类有三个数据域,key、value(键值对),next(指向下一个Entry)。 例如,

浅谈Java中的equals和==

核能气质少年 提交于 2019-12-14 21:16:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2));   为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。 一.关系操作符“==”到底比较的是什么?   下面这个句话是摘自《Java编程思想》一书中的原话:   “关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。   这句话看似简单,理解起来还是需要细细体会的。说的简单点,==就是用来比较值是否相等。下面先看几个例子: public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int n=3; int

Java HashMap工作原理

丶灬走出姿态 提交于 2019-12-14 16:36:41
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 内部存储 Java HashMap类实现了Map<K, V>接口。这个接口中的主要方法包括: V put(K key, V value) V get(Object key) V remove(Object key) Boolean containsKey(Object key) HashMap使用了一个内部类Entry<K, V>来存储数据。这个内部类是一个简单的键值对,并带有额外两个数据: 一个指向其他入口(译者注:引用对象)的引用,这样HashMap可以存储类似链接列表这样的对象。 一个用来代表键的哈希值, 存储这个值可以避免 HashMap在每次需要时都重新生成键所对应的哈希值。 下面是Entry<K, V>在Java 7下的一部分代码: 1 2 3 4 5 6 7 staticclassEntry<K,V>implementsMap.Entry<K,V> { finalK key; V value; Entry<K,V> next; inthash; … } HashMap将数据存储到多个单向Entry链表中(有时也被称为桶bucket或者容器orbins)。所有的列表都被注册到一个Entry数组中(Entry<K, V>[]数组),这个内部数组的默认长度是16。

Java HashMap工作原理【图文版】

て烟熏妆下的殇ゞ 提交于 2019-12-14 16:36:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 大部分Java开发者都在使用Map,特别是HashMap。HashMap是一种简单但强大的方式去存储和获取数据。但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.HashMap的大量源代码(包括Java 7 和Java 8),来深入理解这个基础的数据结构。在这篇文章中,我会解释java.util.HashMap的实现,描述Java 8实现中添加的新特性,并讨论性能、内存以及使用HashMap时的一些已知问题。 内部存储 Java HashMap类实现了Map<K, V>接口。这个接口中的主要方法包括: V put(K key, V value) V get(Object key) V remove(Object key) Boolean containsKey(Object key) HashMap使用了一个内部类Entry<K, V>来存储数据。这个内部类是一个简单的键值对,并带有额外两个数据: 一个指向其他入口(译者注:引用对象)的引用,这样HashMap可以存储类似链接列表这样的对象。 一个用来代表键的哈希值, 存储这个值可以避免 HashMap在每次需要时都重新生成键所对应的哈希值。 下面是Entry<K, V>在Java 7下的一部分代码: static class

Oracle体系结构和用户管理

隐身守侯 提交于 2019-12-14 05:54:23
博文结构 Oracle数据库体系结构 Oracle物理结构 Oracle逻辑结构 Oracle内存结构 Oracle进程结构 创建用户并授权 一.oracle体系结构概述 Orcale体系结构 Oracle体系结构包含一系列组件。 如图显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件 和归档日志文件等. 从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的 两个概念, DBA -个很重要的工作就是维护实例和数据库本身的正常工作。 1.实例 Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle 实 例启动时,将分配- -个系统全局区(SGA) 并启动一系列Oracle后台进程。Oracle 实例有两种类型: 单进程实例和多进程实例。单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下 的Oracle实例仅允许- -个用户可存取。多进程Oracle实例(又称多用户Oracle)使用多个进程来执行 Oracle的不同部分,对于每个连接的用户都有一个进程。 2.数据库 数据库是数据的集合,物理上是指存储数据库信息的一组操作系统文件,每个数据库有-个逻 辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件