java
文章平均质量分 77
不行就改名
这个作者很懒,什么都没留下…
展开
-
java中的锁
锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是通过CAS操作实现的,...原创 2018-06-26 16:18:37 · 313 阅读 · 0 评论 -
线上常见问题排查之CPU过高
目前应用程序基本是Java,所以需要登录docker容器内部执行jstack命令打印堆栈信息再分析。确认目标进程执行top命令查看CPU占用情况,找出CPU占用高的进程ID。PS:输入大写P即可按照CPU占比排序进程(即 Shift + p)# top找出对应进程信息# ps -ef|grep 进程号登录容器查看容器ID# sudo docker ps -a进入容器# sudo docke...原创 2018-05-31 18:00:17 · 2062 阅读 · 1 评论 -
Concurrenthashmap的实现原理分析
1. HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同)。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Col原创 2018-06-04 15:37:22 · 29801 阅读 · 5 评论 -
JAVA分布式锁的实现
为什么要使用分布式锁?为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效...原创 2018-05-16 10:35:52 · 1020 阅读 · 0 评论 -
AQS实现原理
AQS(AbstractQueuedSynchronizer)即 队列同步器,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。 同步器的主要使用方式是继承。子类推荐被定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组...原创 2018-05-20 13:22:26 · 16281 阅读 · 3 评论 -
Redis集群
在介绍Redis的集群方案之前,我们先来谈一下数据分区的几种策略。 主要的数据分区有顺序分区和哈希分区,我们这里主要讲的是哈希分区,常见的哈希分区规则有几种,下面分别介绍: A:节点取余分区 使用特定的数据,如Redis的键或用户ID,再根据节点数量N使用公式:hash(key)%N计算出哈希值,用来决定数据映射到哪一个节点上。这种方案存在一个问题:当节点数量...原创 2018-05-18 15:49:59 · 572 阅读 · 0 评论 -
序列化和反序列化的底层实现原理
序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知!一、基本概念...转载 2018-04-27 16:45:09 · 806 阅读 · 0 评论 -
JAVA并发理解之volatile、synchronized和lock解析
谈到并发时候,离不开JAVA的几个关键字volatile、synchronized和lock类。下面就分别介绍一下它们的实现原理、用法以及使用场景。 首先先了解一下Java内存模型的抽象示意如图所示 *每个线程都有自己的本地内存空间(java栈中的帧)。线程执行时,先把变量从内存读到线程自己的本地内存空间,然后对变量进行操作。 * 对该变量操作完成后,...原创 2018-03-27 16:41:55 · 733 阅读 · 0 评论 -
JAVA并发理解之重排序问题
首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示 上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-ser...原创 2018-03-26 20:30:49 · 7483 阅读 · 0 评论 -
JAVA并发理解之原子操作
本章主要介绍一下原子 操作的概念以及JAVA是如何保证原子性的。原子:本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。接下来让我们看一下处理器和Java里是如何实现原子操作的。 1)处理器如何实现原子操作 处理器主要是提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。 第一个...原创 2018-03-26 16:33:15 · 299 阅读 · 0 评论 -
JVM理解之垃圾回收(二)
这篇文章主要接着上篇博客针对jvm是如何进行垃圾回收的进行介绍。下面将分别介绍主要的回收算法和所用到的垃圾收集器,帮忙大家对jvm垃圾回收机制有更全面的认识。 1)垃圾收集算法 垃圾收集算法,主要包括四种分别是:”标记-清除”(Mark-Sweep)、“复制”(Copying)、“标记-整理”(Mark-Compact)、“分代收集”(Generational Col...原创 2018-03-23 16:02:35 · 221 阅读 · 0 评论 -
JVM理解之垃圾回收(一)
说起Java的垃圾回收机制,无非弄懂三个问题: 哪些内存需要回收? 什么时候回收? 怎么回收?下面将分别针对上面提出的问题一一解释:1)哪些内存需要回收 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)。也就是说回收的就是所谓的已经死去的对象。下面...原创 2018-03-23 11:04:29 · 202 阅读 · 0 评论 -
JVM理解之运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 1)程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器;每...原创 2018-03-22 15:06:33 · 244 阅读 · 3 评论