随笔分类 -  Java

JAVA中IO技术:BIO、NIO、AIO
摘要:1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 由上 阅读全文
posted @ 2019-06-26 15:36 外星猿 阅读(318) 评论(0) 推荐(0)
【消息队列MQ】各类MQ比较
摘要:目前业界有很多MQ产品,我们作如下对比:RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心... 阅读全文
posted @ 2014-10-08 11:18 外星猿 阅读(593) 评论(0) 推荐(0)
全局唯一ID生成器(Snowflake ID组成)
摘要:SnowflakeID组成SnowflakeID有64bits长,由以下三部分组成:time—42bits,精确到ms,那就意味着其可以表示长达(2^42-1)/(1000360024*365)=139.5年,另外使用者可以自己定义一个开始纪元(epoch),然后用(当前时间-开始纪元)算出time... 阅读全文
posted @ 2014-07-17 15:42 外星猿 阅读(10105) 评论(0) 推荐(2)
八种常用的排序算法(转)
摘要:下面要讲到的8种排序都属于内部排序,既在内存中完成,主要从理论原理方面来分析的。 插入排序①直接插入排序例:六个数12 15 9 20 6 31 24 用直接插入排序,如下图:思路:第一步:从给出的六个数中,随便拿出一个数,比如12,形成一个有序的数据序列(一个数当然是有序的数据序列了,不看12之外... 阅读全文
posted @ 2014-05-15 10:42 外星猿 阅读(268) 评论(0) 推荐(0)
CAS原理分析
摘要:在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等... 阅读全文
posted @ 2014-05-07 11:02 外星猿 阅读(4067) 评论(0) 推荐(0)
操作系统CPU上下文切换
摘要:关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization)。 上下文切换: 目前流行的CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程(包括多核CPU),Linux内核会把多核的处理器当作多个单独的CPU来识别。 一个标准的Linux内核可以支持运行50~50000个进程运行,对于普通的CPU,内核会调度和执行这些进程。每个进程都会分到CPU的时间片来运 行,当一个进程用完时间片或者被更高优先级的进程抢占后,它会备份到CPU的运行队列中,同时其他进程在CPU上运行。这个进程切换的... 阅读全文
posted @ 2014-04-07 18:47 外星猿 阅读(2185) 评论(0) 推荐(0)
从Java视角理解CPU上下文切换(Context Switch)
摘要:在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致往往执行速度还不如单个线程. 在这里有一个经常提及的概念就是: 上下文切换(Context Switch).上下文切换的精确定义可以参考: http://www.linfo.org/context_switch.html. 下面做个简单的介绍. 多任务系统往往需要同时执行多道作业.作业数往往大于机器的CPU数, 然而一颗CPU同时只能执行一项任务, 如何让用户感觉这些任务正在同时进行呢? 操作系统 阅读全文
posted @ 2014-04-04 16:13 外星猿 阅读(466) 评论(0) 推荐(0)
Java多线程程序设计小记
摘要:一、什么是线程基础知识。线程是CPU调度的最小单元。一个线程可以看作是在执行一个任务。除创建和销毁,线程的生命周期还包括就绪、运行、阻塞。二、多线程的工作原理CPU是按时间片来运行任务的,多个线程都有机会获得时间片,这样多个任务就可以并发地执行。线程间的切换会涉及到上下文保存的开销。由于线程间共享进程内的数据资源,故线程切换的开销比进程切换的开销要小很多。在大多数通用的处理器中,上下文切换的开销相当于5000到10000个时钟周期。因为大多时候一个线程不可能满负荷地占用CPU,会有一些IO或接口调用的操作,这个时候CPU是空闲的,就可以切换别的线程执行,从而大大地提高效率和并发量。三、如何使用 阅读全文
posted @ 2014-03-30 23:20 外星猿 阅读(152) 评论(0) 推荐(0)
java整体集合框架(转)
摘要:1、关于集合的两道面试题先来看几道题目:1、创建一个不可变的的集合:public static void main(String[] args) { Set set = new HashSet(); set.add("Java"); set.add("JEE"); set.add("Spring"); set.add("Hibernate"); set = Collections.unmodifiableSet(set); set.add("Ajax"); // not allowed.}可以看 阅读全文
posted @ 2014-03-20 10:12 外星猿 阅读(302) 评论(0) 推荐(1)
深入研究 Java Synchronize 和 Lock 的区别与用法
摘要:在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。我们先从最简单的入手,逐步分析这2种的区别。一、synchronized和lock的用法区别synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且 阅读全文
posted @ 2014-03-19 10:59 外星猿 阅读(1714) 评论(0) 推荐(0)
JMS学习的个人理解笔记
摘要:Jms即java消息服务javamessage service,所谓的面向消息编程,主要应用在企业内部各个系统之间做接口,以异步方式传递消息数据。Jms有2种传送模式,先来看第一种,即点对点传送模式首先是参与整个过程的系统,总共有3个,分别是发送方系统、jms服务器、接收方系统,原理很简单,基本步骤如下:1、 发送方将jms消息发送到jms服务器;2、 Jms服务器有一个消息队列,所谓队列就是先进先出;jms服务器接收到消息后,把消息放到消息队列中;3、 接收方主动的去jms服务器的消息队列中查询消息;以上步骤中,有几个关键点,理解了这几个关键点,就理解原理了。关键点如下:1、 发送方把消息发 阅读全文
posted @ 2014-03-03 17:21 外星猿 阅读(228) 评论(0) 推荐(0)
Java编程军规
摘要:军规一:【避免在程序中使用魔鬼数字,必须用有意义的常量来标识。】军规二:【明确方法的功能,一个方法仅完成一个功能。】军规三:【方法参数不能超过5个】军规四:【方法调用尽量不要返回null,取而代之以抛出异常,或是返回特例对象(SPECIAL CASE object,SPECIAL CASE PATTERN);对于以集合或数组类型作为返回值的方法,取而代之以空集合或0长度数组。】军规五:【在进行数据库操作或IO操作时,必须确保资源在使用完毕后得到释放,并且必须确保释放操作在finally中进行。】军规六:【异常捕获不要直接catch (Exception ex) ,应该把异常细分处理。】军规七: 阅读全文
posted @ 2014-01-12 17:15 外星猿 阅读(252) 评论(0) 推荐(0)
线程之ReadWriteLock
摘要:import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ThreadReadWriteLock { /** * 读写锁 * 读得时候还能读 * 读的时候不能写 * 写的时候不能读 * 写的时候不能写 */ publi... 阅读全文
posted @ 2012-12-10 21:58 外星猿 阅读(173) 评论(0) 推荐(0)
Java编程中“为了性能”尽量要做到的一些地方
摘要:最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:第一,控制资源的使用,通过线程同步来控制资源的并发访问;第二,控制实例的产生,以达到节约资源的目的;第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。2. 尽量避免随意使用静态 阅读全文
posted @ 2012-06-03 22:23 外星猿 阅读(149) 评论(0) 推荐(0)
TCP协议三次握手过程分析(转载)
摘要:TCP(Transmission Control Protocol) 传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SY 阅读全文
posted @ 2012-01-09 13:30 外星猿 阅读(206) 评论(0) 推荐(0)