自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Liu Xin's Blog

http://blogxin.cn/

  • 博客(21)
  • 收藏
  • 关注

原创 blog迁移到: http://blogxin.cn/

blog地址: http://blogxin.cn/

2017-02-03 21:51:39 500

原创 JUC - ThreadPoolExecutor 源码分析

ThreadPoolExecutor,Java线程池。使用线程池可以降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗;可以提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行;可以提高线程的可管理性,防止无限制的创建线程,消耗系统资源。下面首先通过初始化参数介绍一下线程池:初始化参数 public ThreadPoolExecutor(int corePo

2016-11-27 22:13:10 806

原创 Java内存模型(JMM)核心概念总结

Java的采用的是共享内存模型,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象

2016-11-12 19:20:10 991

原创 JUC - AbstractQueuedSynchronizer(AQS) 源码分析

AbstractQueuedSynchronizer,同步器,以下简称AQS。本文从源码分析AQS的核心方法和实现原理。 AQS内部有两组重要的成员变量: 1. int类型的status变量,通过CAS操作(详见:CAS深度分析)改变status值来控制当前线程能否访问资源以及并发数量。 2. Node类型的head和tail两个变量,两个变量维护了一个FIFO的同步队列,

2016-09-28 15:24:48 1118

原创 Java NIO 文件IO-内存映射文件MappedByteBuffer与zerocopy

在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数read()、write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。这么做是为了减少磁盘的IO操作,为了提高性能而考虑的,因为我们的程序访问

2017-01-31 23:32:27 1927

原创 I/O 多路复用之select、poll、epoll实现原理及对比总结

select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核

2017-01-31 23:31:59 2671

原创 Java NIO Selector详解

Selector选择器Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够发现通道是否为读写等事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。Selector的实现根据JVM运行的操作系统不同会有相应的不同的实现,上层API对底层做了抽象,这样上层API无需关心底层操作系统的变化,可以在不同操作系统上实现相同的功能。实现了Sele

2017-01-24 00:33:56 1494

原创 Java NIO Channel详解

Channel通道在JAVA NIO中,基本上所有的IO都是从Channel开始的,读取操作即从Channel读到Buffer,写操作即从Buffer写入Channel。在网络IO方面,Channel的主要实现是DatagramChannel、SocketChannel和ServerSocketChannel,DatagramChannel 能通过UDP读写网络中的数据。SocketChanne

2017-01-18 22:34:56 986

原创 Java NIO Buffer详解

Buffer缓冲区缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。它们是: 容量(Capacity) 缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。 上界(Limit) 缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。 位置(Position) 下一个要被读或

2017-01-14 23:47:02 697

原创 Java IO模型

目前常用的IO通信模型包括四种:阻塞同步I/O(blocking IO)非阻塞同步I/O(nonblocking IO)多路复用I/O(IO multiplexing)异步I/O(asynchronous IO)这些IO模型都是要靠底层操作系统进行支持,应用程序只是提供相应的实现,对操作系统进行调用。本文将介绍这四种IO模型及Java对这四种IO模型的支持。对于一次IO访问(以read举例

2016-12-18 16:00:24 673

原创 JUC - FutureTask 源码分析

FutureTask,可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所

2016-11-29 23:43:16 632

原创 ThreadLocal 源码分析

简介ThreadLocal线程局部变量,使得各线程能够保持各自独立的一份对象。通常被定义为类的静态类变量。ThreadLocal类本身定义了有get(), set(), remove()和initialValue()方法。前面三个方法是public的,initialValue()是protected的,主要用于我们在定义ThreadLocal对象的时候根据需要来重写。这样我们初始化这么一个对象在里面

2016-11-18 19:15:57 662

转载 Unsafe 源码分析

转载:http://www.cnblogs.com/mickole/articles/3757278.htmlsun.misc.Unsafe/** * This class should provide access to low-level operations and its * use should be limited to trusted code. Fields can be ac

2016-11-17 10:25:12 423

原创 Java Cache Line 伪共享及解决方案

伪共享问题本质:多个变量被cpu加载在同一个缓存行中,当在多线程环境下,多个变量被不同的cpu执行,导致缓存行失效而引起的大量的缓存命中率降低。缓存一致性协议MESI协议中,每个CPU的Cache控制器不仅知道自己的读写操作,而且也监听其它CPU的读写操作。每个Cache line所处的状态根据本核和其它核的读写操作在4个状态间进行迁移。其他CPU的写会导致本CPU的Cache无效,下次访问时如果C

2016-11-15 17:42:55 2340

原创 JUC - ReentrantReadWriteLock 源码分析

ReentrantReadWriteLock,读写锁。维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader 线

2016-10-16 02:09:38 1390 2

原创 JUC - Condition 源码分析

Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。Condition 实例实质上被绑定到一个锁

2016-10-12 15:38:55 1044

原创 JUC - ReentrantLock 源码分析

ReentrantLock,一个可重入的独占锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。源码分析ReentrantLock的实现方式是在内部定义了一个实现AbstractQueuedSynchronizer(详见:JUC 源码分析 - AbstractQueuedSynchronizer(AQS))的内部类Syn

2016-10-11 18:05:25 907

原创 JUC - CountDownLatch 源码分析

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。源码分析CountDownLatch的实现方式是在内部定义了一个实现AbstractQueuedSynchronizer(详见:JUC 源码分析 - AbstractQueuedSynchronizer(AQS))的内部类Sync,Sync主要实现了AbstractQueued

2016-10-11 10:58:45 885

原创 JUC - Semaphore 源码分析

Semaphore,信号量。用于控制同时访问特定资源的线程数量,来保证合理的使用特定资源。比如:有10个数据库连接,有30个线程都需要使用连接,Semaphore可以控制只有10个线程能够获取连接,其他线程需要排队等待,当已经获取到连接的线程释放连接,排队的线程才能够去申请获取。源码分析Semaphore的实现方式是在内部定义了一个实现AbstractQueuedSynchronizer的内部类Sync

2016-10-08 16:58:34 697

原创 Activiti工作流样例教程(请假-审批流程并向用户展示工作流实时过程图)

1 配置工作流。启动activiti-explorer并登录。(用户名:kermit;密码:kermit)选择 流程->流程设计工作区->新建模型 输入流程名称进入流程设计界面,绘制流程图:给事件和活动添加ID,并给活动分配(Assignments)代理人(assignee):保存退出编辑界面,处理模型选择导出模型,导出工作流文件process.bp

2014-12-24 11:34:32 6118

原创 Linux 学习笔记

Unix两条基本原则:  1.一切皆文件  2.KISS(Keep it simple stupid) Linux系统分区大小分配:/      根分区 1000(严格限制大小)Swap  交换分区 大小为内存两倍(严格限制大小)/boot  启动目录 1500(严格限制大小) /home  存放用户主目录 4500(尽量大)/usr  存放厂商目录 450

2014-08-11 10:29:29 656

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除