- 博客(186)
- 资源 (2)
- 收藏
- 关注
原创 JAVA排序算法
public class Sort { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < 10; i++) arr[i] = (int) (Math.random() * 100); h...
2018-07-14 22:39:03
244
原创 concurrentHashMap 1.8原理
sizeCtl负数代表正在进行初始化或扩容操作1代表正在初始化N 表示有N-1个线程正在进行扩容操作0代表hash表还没有被初始化正数值始终是当前ConcurrentHashMap容量的0.75倍,这与loadfactor是对应的CAS同步操作获取值设置值(CAS、voliate)get与hashmap相同,不控制读的同步put如果当前结点为forwarding则帮助扩容如果非forwarding...
2018-07-14 16:09:18
2051
原创 红黑树
普通红黑树过于复杂,这里采用一种比较简单的左倾红黑树,定义略有不同,实现效果更好。规定所有红链接均为左链接没有任何一个结点连着两个红链接该树是完美黑色平衡的操作插入结点的链接颜色均为红色如果右结点链接为红色,左旋转如果左节点和左左节点链接均为红色,右旋转如果同层左右结点链接均为红色,它们同时变黑,父节点变红色根结点永远设置为黑色,如果由红变黑一次,说明树的高度增加插入-伪代码实现 ...
2018-07-14 12:21:29
259
原创 ReentrantLock原理——AQS
AQS原理AQS,AbstractQueuedSynchronizer,抽象同步器队列,用来处理多线程访问资源的工具队列,具体依赖他的类有:ReentrantLock、Semaphore、CountDownLatch、CycilBarrier等。虽然叫做abstract也是一个抽象类,但是类中所有的方法都是实现的,在需要的时候我们只重写需要的方法即可。工作机制:维护一个链表队列,这些队列的结点通过...
2018-07-14 11:56:17
423
原创 偏向锁-轻量锁-重量锁-自旋锁
自旋锁自选锁其实就是在拿锁时发现已经有线程拿了锁,一般情况下需要阻塞自己,但是这种挂起和唤醒需要切换至核心进程耗费资源,这个时候会选择进行忙等循环尝试。也就是不停循环看是否能等到上个线程自己释放锁。这个问题是基于一个现实考量的:很多拿了锁的线程会很快释放锁。因为一般敏感的操作不会很多。当然这个是一个不能完全确定的情况,只能说总体上是一种优化。自旋适应锁自旋的次数不固定,它是由前一次在同一个锁上的自...
2018-07-13 21:25:18
1060
原创 java多线程部分概念整理
concurrentHashMap中的size、isEmpty方法使用情况并不多,而且尽可能是一个当前情况的估计值当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。CopyOnWriteArrayList用于代替同步List,BlockingQueue也可以Blocking...
2018-07-13 16:31:37
245
原创 synchronized&ReentrantLock
保证线程安全的方法有很多,但是实际上我们要做的就是保证堆空间也就是JMM中的主内存的数据的安全性,这才是并发的关键。首先确保其安全,其次考虑是否有死锁、饥饿、活锁等情况会发生,进行优化。synchronized使用在修饰非static方法的时候,synchronized只能确保当前修饰的this对象不会被同时修改。这个概念理解错的或不能理解的人都是对并发本身的理解有问题,并发的同步就是确保线程间修...
2018-07-13 16:25:26
267
原创 JDBC
概念Java Database Connectivity。JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。 JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。c3p0c3p0是一种数据库连接池,它扩展了传统的jdbc数据库连接池,底层的连接还是J...
2018-07-13 10:27:53
268
原创 类加载器机制&双亲委派模型
类加载器机制JAVA允许类从不同的地方被加载,只要得到的是二进制的class文件即可进行运行,所以需要一个管理加载类文件的工具,这个工具就是类加载器。类加载器负责加载类文件到JVM中。JAVA中有多个系统自己定义的类加载器:启动类加载器Bootstrap ClassLoader,负责加载\lib目录下核心库(rt.jar目录)扩展类加载器Extension ClassLoader,负责加载\lib...
2018-07-13 10:10:21
347
原创 Comparator&Comparable区别
comparablecomparable,有人叫它“内比较”,这种叫法源于他是一个参数,同类之间的比较,我认为这样理解也是可以。在构建类图的时候,让上层的抽象类或者接口继承comparable接口,以此来实现comparTo方法,传入一个参数和this做比较。这个接口比较靠近架构的想法,它说明这个类是有比较的概念的。同时,实现了这个方法,也可以调用conllections和arrays类的sort...
2018-07-12 18:24:39
321
原创 1、2、3及BC范式概念
第一范式定义关系中的每个属性都不可再分。理解基本的数据库都满足第一范式。第二范式定义1)关系中不存在非主属性对于主属性的部分函数依赖。2)非主属性必须对主属性完全依赖。举例比如主属性为:A、B,而C作为一个非主属性,只与A有依赖关系,C与B无关,那么此时C对于A、B只存在部分依赖,此时不符合第二范式。理解符合第二范式的关系能够保证每一个非主属性都严格的依赖主属性。就是任何一个非主属性都必须和所有的...
2018-07-12 17:30:35
1874
原创 一句话解释JAVA线程间通信
网上总结了10多种线程间通信的方式,看得我有些头晕,有的人说while轮询也是一种线程通信方式,我想问个问题,那我for轮询是不是也算一种轮询方式呢?问题的关键在于,怎样总结这些线程通信的模型。我认为,线程通信只有两种,1.共享内存;2.线程间直接通信。再多的都是从这两种演化出来的实现方法。## 共享内存通信1. await,notify2. join3. volatile4. cyclicBar...
2018-07-11 19:32:58
305
原创 happen-before
happen-beforeJVM有一个“先行发生”(happen—before)的规则,它是内存模型中定义的两项操作之间的偏序关系,如果操作A - HB - B,其意思就是说:A这个操作对于B是可见的。通俗地说:只要A发生了变化,B一定能观察到。可以对比强一致性和弱一致性的概念对比。程序顺序原则:一个线程内保证语义的串行性volatile规则:volatile变量的写 - HB - volatil...
2018-07-11 18:43:26
339
原创 HashMap的线程安全解决方案
SynchronizedMapCollections.synchronizedMap,直接给集合中所有方法上锁。低效。Hashtable直接给集合中所有方法上锁。低效。1.7 ConcurrentHashMapconcurrentHashMap是弱一致性,hashTable是强一致性。分段锁SegmentConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构...
2018-07-11 18:24:19
1381
原创 线程池概念
概念我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线程会去取这个队列里的任务。当一个新任务插入队列时,一个空闲线程就会成功的从队列中取出任务并且执行它。合理的配置线程池要想合理的配置线程池,就必须首先分析任务特性,可以从以下...
2018-07-11 16:36:50
898
原创 CAP
CAPConsistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容忍性) 可靠性C:一致性,就是说所有的服务器上面的数据都是一样的,A:可用性,用户访问服务器上面的数据,响应时间在可以接受的范围内P:分区容忍性,其实就是高可用性,一个节点崩了,并不影响我们其它的节点1:满足C,所有的机器上的...
2018-07-11 10:04:24
2255
原创 MySQL数据库原理
MySQL架构连接池:最上层负责和客户端进行连接,比如jdbc,odbj这样的数据库连接的API,在这一层有连接池的概念,类似于线程池,连接池可以同时处理很多个数据库请求。同时这一层有SSL的安全概念,可以确保连接是安全的。SQL接口:当SQL语句进入MySQL后,会先到SQL接口中,这一层是封装层,将传过来的SQL语句拆散,将底层的结果封装成SQL的数据格式。解析器:这一层负责将SQL语句进行拆...
2018-07-11 09:35:15
1440
原创 StorageEngine
1 什么是存储引擎?MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持...
2018-07-10 18:22:35
673
原创 SQL慢查询
分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。1 导致SQL慢查询的原因在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。SQL编写问题锁业务实例相互干绕对...
2018-07-10 18:22:09
976
原创 RPC
RPC是一种概念,用以让远程连接的多台服务器可以像调用本地方法一样互相调用。 RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。 即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。由于计算能力需要横向扩展,需要在多台机器组成的集群上部...
2018-07-10 18:21:42
362
原创 Paas Iaas Saas
IaaS:基础设施服务,Infrastructure-as-a-servicePaaS:平台服务,Platform-as-a-serviceSaaS:软件服务,Software-as-a-service基础架构即服务——IaaS IaaS通过虚拟化技术将服务器等计算平台同存储和网络资源打包,通过 API 接口的形式提供给用户。用户不用再租用机房,不用自己维护服务器和交换机,只需要购买 IaaS 服...
2018-07-10 18:21:14
310
原创 iBatis
iBatis是数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。 iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可。insertdeleteupda...
2018-07-10 18:20:37
821
原创 Guava
guava是google开发的一套工具jar库。这个库可以方便编码,减少编码错误,让你的代码变得更加优雅。Optionalcom.google.common.base.OptionalGuava设计Optional来解决null问题,Optional<T>表示可能为null的T类型的引用。Optional实例要么包含一个非null的引用,要么什么都不包含(absent),从不会包含nu...
2018-07-10 18:20:10
1393
原创 Gson
工作中遇到的比较好用的工具方法,记录一下1 Gson1.1 功能pojo与json转换1.2 举例import com.google.gson.Gson; //json转换为pojo Gson gson = new Gson(); ClearingVoucherReqDto reqDto = gson.fromJson(message, ClearingVoucherReqDto.cl...
2018-07-10 18:19:04
601
原创 CAT
APM —— Application Performance Management,应用性能管理。对企业应用进行即时的监控以实现对应用程序性能管理和故障管理的系统化的解决方案。CAT是点评开源的APM工具,分布式实时监控系统。1 监控模型模型说明Transaction一段代码执行时间,比如URL、Cache、SQL执行次数和响应时间Event一行代码的执行次数,比如出现一个异常Problem系统可...
2018-07-10 18:18:26
606
原创 hashcode
在某个运行时期间,只要对象的(字段的)变化不会影响equals方法的决策结果,那么,在这个期间,无论调用多少次hashCode,都必须返回同一个散列码。通过equals调用返回true 的2个对象的hashCode一定一样。通过equasl返回false 的2个对象的散列码不需要不同,也就是他们的hashCode方法的返回值允许出现相同的情况。JVM中根据hashcode寻找存放的对象在重写equ...
2018-07-09 10:04:48
296
原创 HashMap源码
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。hashmap是一种用空间换时间的数据结构,如何去定义桶的大小,是最关键的要衡量的指标。如果桶过大,则空间浪费,如果桶过小,则会频繁发生冲突。在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的...
2018-07-09 10:04:14
239
原创 CAS配上重试
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因...
2018-07-09 10:02:46
2786
原创 Vector
Vector类似于ArrayList,原理相同。不同点在于,Vector中所有的方法都被synchronized修饰,这样在多线程中Vector能够保证线程的安全,而ArrayList需要借助其他工具。而且这两个类的grow方法的增长系数不同。public class Vector<E> extends AbstractList<E> implements...
2018-07-09 09:59:46
221
原创 Stack
stack是Vector的一个子类,主要实现了一些关于栈的push和pop等方法,其中需要注意的是push方法实际上没有被synchronized修饰,其实是没关系的,因为在push中调用的addElement方法在父类Vector中已经被synchronized修饰了。public class Stack<E> extends Vector<E> { /** ...
2018-07-09 09:58:36
800
原创 LinkedList
具体解释已经在注释中给出。public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0;...
2018-07-09 09:58:05
207
原创 ArrayList源码
具体解释已经在注释中给出。public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersion...
2018-07-09 09:57:15
208
原创 JAVA集合
以下,结合源码分析集合类所有集合数据结构对接口。以JDK1.8为准。1. Collectionint size()//返回此 collection 中的元素数。//如果此 collection 包含的元素大于 Integer.MAX_VALUE,则返回 Integer.MAX_VALUE。boolean isEmpty()//如果此 collection 不包含元素,则返回 true。 ...
2018-07-09 09:56:07
301
原创 数据库锁
锁在数据库中用来保持并发时的安全性,确保同一时间对数据库的操作是不会出现问题的。锁的性质分类乐观锁:乐观锁是一种概念,不为数据加显示的锁,但是会维护一个版本号或者时间戳,在完成数据操作的时候会检查这个版本号,如果不大于之前获取的值则说明在此期间没有发生更新,可以完成事务。乐观锁有更好的并行性,但是在事务处理比较集中的时候失败率比较高,在事务分散的时候效率不错。而且在多服务多系统中,如果其他的服务调...
2018-07-06 10:08:05
269
原创 RabbitMQ
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。归根结底,企业应用系统就是对数据的处理,而对于一个拥有多个子系统的企业应...
2018-07-04 10:55:35
470
原创 ACID
ACID是事务的四大特性,想要成为事务,必须具备这四点。Atomicity原子性体现在对于一个事务来讲,要么一起执行成功要么一起失败,执行的过程中是不能被打断或者执行其他操作的。Consistency一致性表现为事务进行过后和执行前,整体系统都是稳定的,比如对于入账出账操作是不会有总资金的变化的。Isolation隔离性表示各个事务之间不会互相影响,数据库一般会提供多种级别的隔离。实际上多个事务是...
2018-07-04 10:54:22
9324
原创 redis
1 what redisredis是一个高性能的内存key-value数据结构存储系统,它可以用作数据库、缓存、消息中间件等。2 why redis在内存中存放数据,对数据操作更快速,可以使用redis作为数据库的缓存、计数器、消息队列等做缓存服务器,将耗时久的语句结果放入redis中,下次查询直接返回结果高并发,大量数据访问数据库时可能出现异常,用redis缓存先接受访问...
2018-07-03 10:38:15
288
原创 zebra
zebra是一种支持读写分离、分库分表、动态数据源、端到端监控的数据库中间件。 数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切...
2018-07-02 13:19:16
3351
原创 Future & Futures
java.util.concurrent.Future为什么需要Future?java调用其他程序的并行编程有同步异步、阻塞非阻塞之分。其中同步阻塞实践意义有但不广泛,异步和非阻塞能让主线程继续执行比较适合广泛使用。而且在并行编程的时候需要关注的点还在于:调用结果如何返回、是否能确认并行调用结束两点。一般情况下使用的方案为开启新线程调用并使用回调函数的方法处理。这种方法问题在于多线程时对于...
2018-07-01 19:26:41
755
原创 JAVA8 函数式接口
为了配合Lambda表达式的使用,为了简化代码编写的过程,JAVA定义了函数式接口的概念。一个接口,有且仅有一个抽象方法,可以不限default和static方法数量,并且被注解@FunctionalInterface所修饰,我们认为这种接口是函数式接口。函数式接口和接口一样,本身没有含义。实现并使用此接口的对象得益于接口定义的参数数量和返回类型,在约定的情况下完成工作。使用函数式接口能提高工...
2018-06-29 14:51:23
221
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅