java
文章平均质量分 65
loredp
这个作者很懒,什么都没留下…
展开
-
java程序员修炼之道(1)
这些天看了《java程序员修炼之道》这本书,觉得还不错,将自己的一些理解以及对本书中的重点归纳了下,希望对后来者有些帮助,后续会根据每天理解的内容,陆续地写一些文章,望自己能够每天都处在学习中。第一章主要是介绍了java7的改进地方: 1.java是解释性语言还是编译性语言 在这一点上,本人跟作者的观点有些不一样,c/c++这些都是典型的编译性语言,而java/c#等之类的语原创 2015-05-18 22:17:27 · 515 阅读 · 0 评论 -
浅谈Java中的equals和==
在初学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行和转载 2017-03-27 13:32:51 · 307 阅读 · 1 评论 -
使用Redis SETNX 命令实现分布式锁
使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法。SETNX命令简介命令格式SETNX key value将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。返回值返回整数,具体为转载 2017-05-04 15:19:15 · 368 阅读 · 0 评论 -
java集成groovy的几种方式对比
Groovy的几种集成方式:groovyshell、GroovyClassLoader、GroovyScriptEngine,其中groovyshell的方式不支持脚本缓存,会导致垃圾回收频繁,并且会出现outofmemoryexception(监控如下图1,这种方式直接抛弃),GroovyClassLoader、GroovyScriptEngine性能上比较接近,比较时间如下(执行同一运算gro原创 2016-11-14 14:43:18 · 4163 阅读 · 0 评论 -
线程安全和不变性
竞争条件只有在多个线程正在访问同一资源且一个或多个线程写入资源时才会发生。如果多线程读取相同的资源竞争条件是不会发生的。 我们可以确保线程之间共享的对象永远不会被任何线程更新,那就是让共享对象不可变,从而线程安全。以下一个例子:public class ImmutableValue{ private int value = 0; public ImmutableValue(int value)翻译 2017-08-04 13:25:37 · 1351 阅读 · 0 评论 -
Java并发/多线程教程
过去计算机有一个单CPU,只能一次执行一个程序。后来计算机可以处理多任务,这意味着计算机可以同时执行多个程序(AKA任务或进程)。但是这不是真的“同时”。单个CPU在程序之间共享。操作系统将在运行的程序之间切换,在切换之前执行每个程序一段时间。 随着多任务处理,软件开发人员面临新的挑战。程序不能再假定所有的CPU时间可用,也不能全部内存或任何其他计算机资源。 “好公民”计划应该释放所有不再使用的资翻译 2017-08-11 15:54:58 · 777 阅读 · 0 评论 -
java内存模型
java内存模型指明了java虚拟机如何利用计算机内存(RAM)工作的。因为java虚拟机是整个计算机的一个模型,那么很自然的他也包含一个内存模型。 如果你想设计一个正确稳定的并发程序,那么理解java内存模型将会对此有很大的帮助。因为java内存模型指明了不同线程怎样和在什么时候能看到其他线程的共享变量被写入了,以及怎样能够成功地同步访问共享变量。 最原始的java内存模型是不足的,所以jav翻译 2017-08-02 14:46:04 · 349 阅读 · 0 评论 -
多线程优点
尽管面临挑战,仍然使用多线程的原因是多线程可以有几个好处: 1.更好的资源利用率。 2.在某些情况下更简单的程序设计。 3.更灵敏的程序。 更好的资源利用率 想象一下从本地文件系统读取和处理文件的应用程序。假设从磁盘读取af文件需要5秒钟,处理时间需要2秒钟。然后处理两个文件 5 seconds reading file A 2 seconds processing file A 5翻译 2017-08-14 10:09:29 · 385 阅读 · 0 评论 -
多线程成本
从单线程应用程序到多线程应用程序不仅提供了优势,它也有一些成本。不要只是因为可以使用多线程启用应用程序。你应该有一个好主意:这样做所带来的好处大于成本。如有疑问,请尝试衡量应用程序的性能或响应能力,而不是仅仅猜测。 更复杂的设计 尽管多线程应用程序的某些部分比单线程应用程序更简单,但其他部分更为复杂。由多个线程执行的访问共享数据的代码需要特别注意。线程的互动并不总是简单。错误线程同步引起的错误可翻译 2017-08-15 14:21:22 · 343 阅读 · 0 评论 -
Resilience4j------RateLimiter
高频控制的配置方式与熔断类似,有对应的RateLimiterRegistry 和 RateLimiterConfig,自定义配置的可选项有:频次阈值 阈值刷新时间 限流后的冷却时间初始化:private void init() { // For example you want to restrict the calling rate of some method to be ...原创 2019-01-22 14:50:03 · 775 阅读 · 0 评论 -
Resilience4j------CircuitBreaker
与Hystrix相比,它有以下一些主要的区别:Hystrix调用必须被封装到HystrixCommand里,而resilience4j以装饰器的方式提供对函数式接口、lambda表达式等的嵌套装饰,因此你可以用简洁的方式组合多种高可用机制 Hystrix的频次统计采用滑动窗口的方式,而resilience4j采用环状缓冲区的方式 关于熔断器在半开状态时的状态转换,Hystrix仅使用一次执...原创 2019-01-22 14:51:27 · 1695 阅读 · 0 评论 -
理解String 及 String.intern() 在实际中的应用
1. 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; 3. String str=”kvill”; St转载 2017-03-27 13:31:34 · 347 阅读 · 1 评论 -
限流模式-Guava的RateLimiter
目前有几种常见的限流方式:1、通过限制单位时间段内调用量来限流2、通过限制系统的并发调用程度来限流3、使用漏桶(Leaky Bucket)算法来进行限流4、使用令牌桶(Token Bucket)算法来进行限流具体我们看下第三种和第四中算法,也是我们目前看到的最常见的限流算法漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接原创 2017-03-24 14:13:10 · 7605 阅读 · 0 评论 -
并发场景下HashMap死循环导致CPU100%的问题
问题的症状从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。转载 2017-03-29 15:21:17 · 874 阅读 · 1 评论 -
排序算法-快速排序
今天讲下,效率比较高的快速排序:总的来说,快速排序讲究的是一种分而治之。先选取一个初始值,从左右两边逐一进行比较,直到起始的index>=end,一次比较结束,然后再在两边的集合里面再做如上的比较,也就是我们常做的递归操作。例如:{49,38,65,97,5}1.首先选取初始值49,从5开始比较,52.当前的位置时4,再从左边比较小的,到65时替换为{5,38,49,97,65}3原创 2016-03-16 17:00:04 · 355 阅读 · 0 评论 -
排序算法-冒泡
今天开始回顾下以前学习的东西了,首当其冲的就是几种常见的算法了:冒泡排序,选择排序,以及插入排序冒泡排序冒泡排序顾名思义,将比较之后的结果像泡泡一样往上移动。首先举个例子:{49,38,65,97,5},冒泡排序的步骤分为如下:(1)49与38比较,交换位置{38,49,65,97,5}(2)49与65比较不需要交换(3)65与97比较也不需要比较(4)97与5比较交换位置原创 2016-03-14 14:01:50 · 350 阅读 · 0 评论 -
排序算法-选择与插入排序
今天主要复习下选择排序以及插入排序:1.选择排序:(百度百科的定义)每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。个人的理解:选择排序就是选择最小的数据放在前面,也是我们最直观的排序方式,举例如下{49,38,65,97,5}:选择最小的数据5,排在最前面,交换位置{5,38,65,97原创 2016-03-15 15:37:36 · 368 阅读 · 0 评论 -
排序算法-归并排序
归并排序,从字面上意思就可以得知它是分治法的一种,将两个已经排好的数组进行归并到一个数组,直接贴代码吧,这样比较清晰public static void mergearrayv1(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid原创 2016-04-14 20:49:51 · 341 阅读 · 0 评论 -
Google Protocol Buffer原理
GoogleProtocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protobuf在我们大学学习的七层网络中应该是处于表示层。Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的原创 2016-10-12 14:02:23 · 290 阅读 · 0 评论 -
java集成groovy优化
继前面一章讲到了groovy的使用方式,有loader以及engine,但是这两个方式的性能还是不能令我们满意,然后我们分析了下groovy的源码,看了下里面的实现逻辑,发现groovy在生成class文件之后(缓存class信息),在每次执行文件操作的时候都会new一个instance,这样做的意义在于engin里面使用binding参数,这样就需要每次生成实例,来产生对应的binding参数,原创 2016-12-02 17:36:31 · 3064 阅读 · 0 评论 -
sax,dom,jdom的优缺点比较
----sax, dom, jdom技术的优缺点比较SAX分析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。 SAX 之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工转载 2016-12-02 17:37:43 · 418 阅读 · 0 评论 -
0.1+0.2!=0.3
Floating Point MathYour language isn't broken, it's doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation转载 2017-03-06 14:50:23 · 1257 阅读 · 0 评论 -
fail-fast
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。要转载 2017-03-29 14:42:40 · 228 阅读 · 0 评论 -
Resilience4j-----BulkHead
介绍Bulkhead意指船舶中的隔舱板,它将船体分割为多个船舱,在船部分受损时可避免沉船。框架中的Bulkhead通过信号量的方式隔离不同种类的调用,并进行流控,这样可以避免某类调用异常危及系统整体。(注:不同于Hystrix,该框架不提供基于线程池的隔离)初始化BulkheadBulkhead的配置方式与熔断类似,有对应的BulkheadRegistry 和 BulkheadConf...原创 2019-01-22 14:52:30 · 1423 阅读 · 0 评论