自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

路漫漫,水迢迢

八十一难拦路七十二变制敌

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

原创 精通Dubbo——Dubbo使用指南

从今天开始我们一起学习一款高兴RPC框架Dubbo,我们从Dubbo的使用到源码逐步深入学习与分析。 Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成,是阿里巴巴SOA服务化治理方案的核心框架。Dubbo概述背景随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以

2017-05-31 21:26:26 6400 2

原创 Java多线程中FutureTask详解与正式环境问题定位

通过FutureTask的源码我们可以看到FuturenTask类实现了RunnableFuture接口,继承了Runnable和Future接口。 public class FutureTask implements RunnableFuture public interface RunnableFuture extends Runnable, Future FutureTask可以交给E

2017-05-27 18:51:00 2502

原创 Java线程Executor框架详解与使用

在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收,在JVM中我们可以通过-Xss设置每个线程的大小。操作系统会调度所有线程并将它们分配给可用的CPU。 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定

2017-05-26 22:55:29 9685 1

原创 Java线程池(ThreadPoolExecutor)原理分析与使用

在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。使用线程池的好处1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性

2017-05-25 21:52:32 28373 7

原创 Java中的常用阻塞队列源码分析

定义支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。ArrayBlockingQueue由数组组成的无界阻塞队列。 一个建立在数组之上被

2017-05-24 21:46:25 2842

原创 Java并发中的ConcurrentLinkedQueue源码分析

本文中多次提到CAS算法,先做个CAS算法的简单描述CAS(非阻塞算法)说明CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 ConcurrentLinkedQueue是一种线程安全的队列。他是使用非阻塞算法(CAS)来实现线程安全的。ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列, 它

2017-05-23 21:42:44 2963 2

原创 ConcurrentHashMap原理详解

ConcurrentHashMap是既高效又线程安全的HashMapHashTable和ConcurrentHashMap区别HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态,因为HashTable只有一把锁。

2017-05-22 21:30:43 1996 1

原创 Java多线程Condition接口原理详解

Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的 Condition接口详解Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创建出来的,换句话

2017-05-21 19:15:23 11455 3

原创 程序员福利——几个不错的技术微信公众号

1、阿里技术  (ali_tech) 阿里巴巴官方技术号,关于阿里的技术创新均将呈现于此2、程序员大咖 (CodePush)为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。3、DBAplus社群 (dbaplus

2017-05-21 12:12:50 8106 2

原创 Java多线程读写锁ReentrantReadWriteLock原理详解

ReentrantLock属于排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读和其他写线程都被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。 下面我们来看看读写锁ReentrantReadWriter特性 公平性选择:支持非公平(默认)和公平的锁获取模式,吞吐量还是非公

2017-05-21 11:58:45 15253 4

原创 Java线程并发中的锁——ReentrantLock(重入锁)原理详解

ReentrantLock是一个重入锁,可以支持一个线程对资源重复加锁,他还支持公平加锁和非公平加锁。synchronized关键字也隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再

2017-05-20 18:32:37 8742 1

原创 Java线程并发中的锁——Lock(下)

接上篇文章独占式同步状态获取与释放通过调用同步器的acquire(int arg)方法可以获取同步状态,该方法对中断不敏感,也就是由于线程获取同步状态失败后进入同步队列中,后续对线程进行中断操作时,线程不会从同步队列中移出,代码示例:public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(a

2017-05-20 11:27:36 3821

原创 Java线程并发中的锁——Lock(上)

Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需

2017-05-19 18:17:11 2033

原创 线程池原理详解与Java代码示例

为什么使用线程池对于服务端的程序,经常面对的是客户端传入的短小(执行时间短、工作内容较为单一)任务,需要服务端快速处理并返回结果。如果服务端每次接受到一个任务,创建一个线程,然后进行执行,这在原型阶段是个不错的选择,但是面对成千上万的任务递交进服务器时,如果还是采用一个任务一个线程的方式,那么将会创建数以万记的线程,这不是一个好的选择。因为这会使操作系统频繁的进行线程上下文切换,无故增加系统的负载,

2017-05-18 18:13:45 923 1

原创 数据库连接池原理详解与自定义连接池实现

实现原理数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存

2017-05-17 18:18:54 27019 7

原创 ThreadLocal详解

ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。ThreadLocal源码分析我们看下ThreadLocal几个关键方法get()/** * Returns the value in the current thread's c

2017-05-16 18:30:23 861

原创 Java多线程并发中的双重检查锁定与延迟初始化

双重检查锁定与延迟初始化在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术。 下面我们看一个非线程安全的延迟初始化对象的例子:public class Singleton { private static Singleton instance; public static Singleton getInstance()

2017-05-15 18:18:44 1150 2

原创 Java多线程中的内存模型

内存模型在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(ExceptionHandler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。 Java线程之间的通信由Jav

2017-05-14 19:35:19 2539

原创 Java多线程volatile详解

volatile定义Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。volatile的作用先让我们说说volatile关键字的作用。它在多处理器开发中保证了共享变量的“可见性

2017-05-14 11:06:31 6002 1

原创 Java多线程死锁与资源限制详解

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。死锁的概念那什么是死锁呢?所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

2017-05-13 21:46:54 1707

原创 Java多线程的上下文切换

对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在我之前的文章中提到过windows的抢占式,这里就不在赘述。 无论是单核还是多核CPU都是支持多线程代码的,CPU通过给每个线程分配CPU时间片来实这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms) CPU通过

2017-05-13 18:26:18 7235 3

原创 深入剖析Sleep、wait、notify、notifyAll、yield、join、Interrupt

sleep原理sleep是Thread类中的静态方法,首先看下sleep的源码/** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the pre

2017-05-13 11:14:46 1849

原创 深入synchronized原理详解

synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在HotSpot JVM实现中,锁有个专门的名字:对象监视器(monitor)。 synchronized就是针对内存区块

2017-05-12 12:34:28 728 1

原创 史上最全synchronized用法详解

Java中synchronized关键字用于代码的同步执行,他可以修饰代码块、方法、this、Object.class,能够保证在多线程环境中只有线程执行。synchronized作用范围越小并发能力越强,下面我们就各种场景来详解举例说明。多个synchronized(this)代码块并发执行当一个线程访问类中的synchronized(this)的代码块时,该类中的其他synchronized(t

2017-05-11 18:00:43 3366

原创 HTTPS通信过程详解

我们知道普通的Http协议通信是没有对传输数据进行加密,数据在传输过程中很容易被窃取,特别是敏感信息,为了造成不必要的损失我们可以采用HTTPS协议。首先介绍我们的网站怎么启用HTTPSNginx配置HTTPS默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中

2017-05-10 18:24:13 5084

原创 SpringMVC常用注解详解

先说扫描注解浅析component-scan 默认扫描的注解类型是 @Component,不过,在 @Component 语义基础上细化后的 @Repository, @Service 和 @Controller 也同样可以获得 component-scan 的青睐 有了<context:component-scan>,另一个<context:annotation-config/>标签根本可以移除

2017-05-09 18:27:45 2301

原创 基于Codis的Redis分布式缓存实现

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。Codis不

2017-05-03 18:05:16 8708

原创 redis实现HA(High Available)的两种实现方式-Sentinel与Keepalived

Sentinel先来说说Sentinel,Sentinel是redis自带的一种实现HA的方式,如果在实际应用中这种方式用的比较少,比较流行的还是KeepAlived。 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: ● 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

2017-05-03 09:31:37 4122

原创 redis集群实现

集群简介Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。 Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。 Redis 集群通过分区(partition)来提供一定程度的可用性

2017-05-02 18:27:17 1023

空空如也

空空如也

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

TA关注的人

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