![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
crazyhuntsman
这个作者很懒,什么都没留下…
展开
-
40个Java多线程问题总结(摘抄至五月的仓颉的博客)
40个问题汇总1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法:(1)发挥多核CPU的优势随着工业的进步,现在的笔记本、台式转载 2018-08-22 15:35:29 · 125 阅读 · 0 评论 -
Dubbo(3):服务提供方实现类到Invoker的转换
一、前言前面dubbo整体架构分析里面我们讲解了服务提供者暴露一个服务的详细过程是,首先具体服务的实现类转换为了Invoker对象,然后Invoker在转换为Exporter,本文就来讲解第一步转换。 二、实现类到Invoker对象的转换服务提供方式是通过下面方法实现服务提供的实现类到Invoker对象的转换其中proxyFactory是代理类的扩展接口,默认情况下这里...转载 2018-08-28 16:31:40 · 409 阅读 · 0 评论 -
Dubbo(4):服务提供方Invoker到Exporter的转换
一、前言前面dubbo整体架构分析里面我们讲解了服务提供者暴露一个服务的详细过程是,首先具体服务的实现类转换为了Invoker对象,然后Invoker在转换为Exporter,本文就来讲解第二步转换。image.png二、Invoker到Exporter的转换服务提供方的Invoker到Exporter的转换是下面代码完成的:image.png其中protocol是...转载 2018-08-28 16:35:56 · 537 阅读 · 0 评论 -
并发基础(1):wait、sleep、await、yield的区别
是否释放锁:调用sleep和yield的时候不释放当前线程所获得的锁,但是调用await/wait的时候却释放了其获取的锁并阻塞等待。 调用后何时恢复:# sleep让线程阻塞,且在指定的时间之内都不会执行,时间到了之后恢复到就绪状态,也不一定被立即调度执行;# yield只是让当前对象回到就绪状态,还是有可能马上被再次被调用执行。# await/wait,它会一直阻塞在条件队...转载 2018-08-29 08:49:44 · 2937 阅读 · 0 评论 -
23种设计模式
一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。其实还有两...转载 2018-09-03 15:11:29 · 101 阅读 · 0 评论 -
深入理解Java内存模型(一)——基础
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通...转载 2018-09-06 17:30:43 · 97 阅读 · 0 评论 -
深入理解Java内存模型(二)——重排序
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,...转载 2018-09-06 17:32:55 · 95 阅读 · 0 评论 -
深入理解Java内存模型(三)——顺序一致性
数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM对正确同步的多线程程序的内存一致性做了如...转载 2018-09-06 17:33:59 · 116 阅读 · 0 评论 -
深入理解Java内存模型(四)——volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L;...转载 2018-09-06 17:35:42 · 107 阅读 · 0 评论 -
深入理解Java内存模型(五)——锁
锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 a...转载 2018-09-06 17:37:07 · 101 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明这两...转载 2018-09-06 17:38:30 · 90 阅读 · 0 评论 -
深入理解Java内存模型(七)——总结
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面几种类型:...转载 2018-09-06 18:19:15 · 116 阅读 · 0 评论 -
Netty(1):线程模型
本文主要介绍Netty线程模型及其实现,介绍Netty线程模型前,首先会介绍下经典的Reactor线程模型,目前大多数网络框架都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,非常适合处理海量的I/O事件。下面简单介绍下Reactor模式及其线程模型。Reactor模式Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,...转载 2018-08-28 16:25:24 · 152 阅读 · 0 评论 -
Dubbo(2):分组与版本号
一、前言在Dubbo中接口类并不能唯一确定一个服务,在dubbo中接口+服务分组+版本号才能唯一确定一个服务,本文就来讲解下服务分组和版本号的使用。二、服务分组当一个接口有多种实现时,可以用 group 区分。服务提供方: image.png 上面配置在服务提供方法提供了com.test.UserServiceBo接口的两套实现,服务分组分别为olddubbo,newd...转载 2018-08-28 12:09:52 · 946 阅读 · 0 评论 -
Dubbo(1):线程模型
一、前言Dubbo默认的底层网络通讯是使用Netty来做的,在服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客户端的链接请求,并把接受的请求分发给EventLoopGroup(worker)来处理,boss和worker线程组我们称为IO线程。如果服务提供方的逻辑能迅速完成,并且不会发起新的 IO 请求,则直接在 IO 线程上处理更...转载 2018-08-28 12:09:06 · 136 阅读 · 0 评论 -
java代码优化(摘抄至五月的仓颉的博客)
代码优化细节(1)尽量指定类、方法的final修饰符带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联...转载 2018-08-22 15:50:20 · 195 阅读 · 0 评论 -
JVM内存模型(摘抄至五月的仓颉的博客)
浅谈JVM内存模型JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途。目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区。 程序计数器程序计数器(ProgramCounterRegister)是当前线程所执行的字节码的行号指示器。这句话理解起来有点拗口,打个比方,我看书看到一半的时候突然接到领...转载 2018-08-22 16:12:21 · 156 阅读 · 0 评论 -
一致性Hash算法(JAVA版)(摘抄至五月的仓颉的博客)
一致性Hash算法关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法、一致性Hash算法的算法原理做了详细的解读。算法的具体原理这里再次贴上:先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个H...转载 2018-08-22 17:43:46 · 132 阅读 · 0 评论 -
十大经典排序算法(摘抄至一像素博客)
0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 0.2 算法复杂度0.3 相关概念...转载 2018-08-22 18:10:00 · 243 阅读 · 0 评论 -
负载均衡算法(3):实现
什么是负载均衡负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这...转载 2018-08-27 11:33:07 · 201 阅读 · 0 评论 -
分布式事务(2):一致性协议
2PC与3PC在分布式系统中,每一个机器节点虽然都能够明确地知道自己在进行事务操作过程中的结果是成功或失败,但却无法直接获取到其他分布式节点的操作结果。因此,当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个称为"协调者(Coordinator)"的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点则被称为"参与者(Participant)"...转载 2018-08-27 11:35:04 · 192 阅读 · 0 评论 -
分布式事务(1):场景
问题的提出在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景。1、火车站售票假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然后拿着车票去检票口,再坐上火车,开始一段美好的旅行----一切似乎都是那么和谐。想象一下,如果他选择的目的地是杭州,而某一趟开往杭州的火车只剩下最后一张车票,可能在同一时刻,不同售票窗口的另一位...转载 2018-08-27 12:04:00 · 638 阅读 · 0 评论 -
Otter+Canal入门篇(1)
前言呜啦啦啦啦!今天笔者又来开坑了,这次开坑的对象呢是阿里的一个开源项目Otter,Otter它是一个数据同步解决方案,可以解决本地跨网络跨机房跨地域的数据同步问题,并且拥有可观的效率,web管理工具等特点,而且背景也很优秀,据说阿里B2B内部的本地/异地机房的同步需求基本全上了otter。附上:喵了个咪的博客:w-blog.cnOtter项目地址:https://github.c...转载 2018-08-27 18:01:38 · 1021 阅读 · 0 评论 -
Otter+Canal入门篇(2)
前言上一节已经简单介绍了Otter的基本信息,本节我们就来开准备搭建一个我们自己的Otter环境,因为一个Otter需要Manage+node+数据库还有很多的依赖,本节我们先来搭建Otter的管理服务器Manager.附上:喵了个咪的博客:w-blog.cnOtter项目地址:https://github.com/alibaba/otterOtter文档地址:https://...转载 2018-08-27 18:02:26 · 693 阅读 · 0 评论 -
Otter+Canal入门篇(3)
前言哈咯大家好呀!今天是对otter准备的最后一个流程,配置好node,并且吧manager,zookeeper和node组合起来形成一个完整可以进行Mysql同步任务的服务,话不多说我们今天就来来事准备工作的最后一步Node搭建吧!附上:喵了个咪的博客:w-blog.cnOtter项目地址:https://github.com/alibaba/otterOtter文档地址:h...转载 2018-08-27 18:03:05 · 479 阅读 · 0 评论 -
Otter+Canal入门篇(4)
前言在前几节我们已经做好了关于otter的准备工作,配置好了zookeeper,manage和node,本节就来完成otter第一个实际功能,单相数据同步.单向数据同步可以解决跨机房主从的问题,所有读操作都能从本地的从库进行操作,而写可以通过外网连接到主服务器进行写入,并且通过otter同步到各个从服务器,可以很好地应对多机房读业务偏多的场景,那么话不多说就开始本节的正文吧!附上:喵了...转载 2018-08-27 18:04:04 · 595 阅读 · 0 评论 -
存淘汰算法--LRU算法
1. LRU1.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。1.2. 实现最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:1. 新数据插入到链表头部;2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3. 当链表...转载 2018-08-23 14:58:16 · 3807 阅读 · 0 评论 -
JVM调优
这里介绍4个垃圾收集器,如果进行了错误的选择将会大大的影响程序的性能。 时至今日,仍然有两个事情困扰着开发人员:垃圾收集(GC)和了解异性(程序猿的悲鸣),后者我确实不太了解,因为我被前者搞的无暇顾及怎么了解异性,特别是当知道在JAVA8中对这一区域有了很大的改进和提升还有移除了PermGen和以一些新的令人兴奋的调优。 当我们谈到垃圾回收时,我们绝大多数都知道利用它的概念在我...转载 2019-01-02 14:01:25 · 254 阅读 · 0 评论