![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
撇不完
今天不走,明天要跑
展开
-
JVM内存区域与内存溢出异常
JAVA内存区域与内存溢出异常(程序员的自我修养第一篇)运行时数据区域java虚拟机所管理的内存包含以下几个运行时数据区域:程序计数器,JAVA虚拟机栈,本地方法栈,JAVA堆,方法区,运行时常量池,直接内存程序计数器该区域是一块较小的内存区域,可看作是当前线程所执行的字节啊的行号指示器,字节码解释器工作室就是通过改变该模块的值来选取下一跳需要执行的字节码指令,分支、循环、原创 2017-12-24 11:31:49 · 138 阅读 · 0 评论 -
atomic包解析
Atomic包是Java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只...转载 2019-03-10 15:02:31 · 231 阅读 · 0 评论 -
ConcurrentLinkedQueue深度解析
并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:加锁,这种实现方式就是我们常说的阻塞队列。 使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下ConcurrentLinkedQueue是...原创 2019-03-09 19:33:18 · 827 阅读 · 0 评论 -
CountDownLatch 实现分析及示例
CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。一个CountDownLatch会通过一个给定的count数来被初始化。其中await()方法会一直阻塞,直到当前的count被减到0,而这个过程是通过调用countDown()方法来实现的。在await()方法不再阻塞以后,所有等待的线程都会被释放,并且任何await()的子调用...原创 2019-03-06 18:22:18 · 806 阅读 · 0 评论 -
CycBarrier深度解析和示例
现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线...原创 2019-03-06 17:24:19 · 742 阅读 · 0 评论 -
ConcurrentHashMap精
本文着重讲解ConcurrentHashmap的源码实现和原理,JDK8中ConcurrentHashmap摒弃了分段锁技术的实现,直接采用CAS和Synchronized保证并发更新安全性,底层采用数组+链表+红黑树的存储结构。其数据结构如下:说明:数据结构采用数组 + 链表 + 红黑树的方式实现。当链表中的节点个数超过8个时,会转换成红黑树的数据结构存储,这样设计的目的是为了减少同一个...原创 2019-03-08 16:06:39 · 133 阅读 · 0 评论 -
ReentrantReadWriteLock精华理解
ReentrantLock在并发情况下只允许单个线程执行受保护的代码,而在大部分应用中都是读多写少,所以,如果使用ReentrantLock实现这种对共享数据的并发访问控制,将严重影响整体的性能。ReentrantReadWriteLock中提供的读取锁(ReadLock)可以实现并发访问下的多读,写入锁(WriteLock)可以实现每次只允许一个写操作。ReentrantLock有两个锁:一...原创 2019-03-05 14:44:01 · 296 阅读 · 0 评论 -
ReentrantLock详解
在Java中通常实现锁有两种方式,一种是synchronized关键字,另一种是Lock.synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的。Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作;虽然锁有很多实现,但是都依赖AbstractQueuedSynchronizer类,我们用ReentrantLo...转载 2019-03-05 13:09:43 · 250 阅读 · 0 评论 -
JAVA Condition 详解
synchronized 关键字,配合Object的wait()、notify()系列方法可以实现等待/通知模式。对于Lock,通Condition也可以实现等待/通知模式。Condition时一个接口,其实现类是AQS中的ConditionObjectLock对象通过newCondition()方法可以获得Condition对象(其实就是ConditionObject)Lock l...转载 2019-03-05 11:44:03 · 410 阅读 · 0 评论 -
synchronized原理分析及自旋锁、偏向锁、轻量级锁和重量级锁的概念和优化
诚然,我们一提到并发编程,首先想到的可能应该就是synchronized,无可厚非其作用。大多数人都会称呼其为重量级锁,但是随着JAVA1.6对synchronized的优化,其变得不再那么重了。1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。下面我们一起来探究synchronized的实现机制以及Java是如何对其进行优化的。从宏观上分析,锁...原创 2019-02-25 18:17:28 · 4920 阅读 · 0 评论 -
JDK8 HashTable 源码分析
话不多说,直接上菜............. Hashtable存储的内容是键值对(key-value)映射,其底层实现是一个Entry数组+链表; Hashtable和HashMap一样也是散列表,存储元素也是键值对(JDK8 hashmap 加入了红黑树机制); HashMap允许key和value都为null,而Hashtable都不能为null,H...原创 2019-02-19 19:52:04 · 232 阅读 · 0 评论 -
JAVA8 HashMap 源码分析,这一篇就够了
本文不对hashMap与Hashtable、ConcurrentHashMap等的区别,重点探讨hashMap的原理。 相较于JDK7,总的来说,JDK7中的hashMap底层采用了数组+链表的数据结构实现数据存储,随着存储数据量的增大,Hash碰撞会越来越频繁。也就意味着链表会越来越长,查找效率不断降低。 JDK8的出现解决了这个问题,对与hashMap采用了新的数据结构...原创 2019-02-19 12:47:25 · 210 阅读 · 0 评论 -
JAVA内存模型(JMM)
关于JAVA并发问题,首先我们需要先了解JAVA内存模型,及常说的JMM。那么什么是JMM:Java内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。关于JMM,我们首先先了解一下JAVA的内存结构。Java虚拟机在执行Java程序的...原创 2019-02-23 18:58:53 · 190 阅读 · 0 评论 -
DCL单例模式,如何解决DCL问题
何为DCL,DCL即Double Check Lock,双重检查锁定。下面从几个单例模式来讲解懒汉式public void Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(...原创 2019-02-27 19:14:41 · 4249 阅读 · 3 评论 -
微信支付扫码模式二
模式一和模式二提供了两种不同的能力,适用于不同的场景,看商户具体的需求。两种模式,在支付的流程中,有一定的共同的流程:1,生成订单。2,用户支付。差别在于:模式一,先扫码,再生成订单。模式二,先生成订单,再扫码。而 生成订单,代表着 本次支付给商户的金额是否是已经确定了。在模式一中,用户扫描的二维码,此时可以还没有确定实际要支付的金额。在模式二中,用户扫描的二维码,金额已经是确定...原创 2018-08-07 21:45:33 · 614 阅读 · 0 评论 -
zookeeper的java客户端api
zookeeper的java客户端apizookeeper客户端无非是对节点的更删改查和监听首先导入zookeeper依赖包定义zookeeper集群要连机器的ip,用","分开;private static final String connectString = "192.168.21.50,192.168.21.51,192.168.21.52";(该值为zo原创 2017-12-25 21:38:09 · 127 阅读 · 0 评论 -
zookeeper角色分配原理和命令行客户端
zookeeper角色分配和命令行简单客户端zookeeper集群有三种角色,分别时leader(总台),follower(议员),observer(观察员)。无论客户端访问哪台zookeeper服务器,最终都会被转发给leader服务器,再通过leader分给follower投票,半数投票通过就认为是可执行操作,否则不会被执行。observer是堆查询操作做负载的,没有投票权。又因为投票半数原创 2017-12-24 22:03:12 · 347 阅读 · 0 评论