自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rhwayfun专栏

在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛!公众号:技术视点

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

原创 Git学习9:Git远程版本库

认识远程版本库本地版本库完成所有的更新后,就需要再更新到远程版本库。由于Git作为一个分布式版本控制系统,远程版本库实际上充当了异地协同办公的桥梁,从此再也不用担心代码丢失的问题了。之前我的博客hexo异地更新与同步就是一个使用git操作远程版本库的例子,大家可以作为参考。不过在这篇文章中,会去系统介绍操作远程版本库的内容。说到远程版本库,大家最熟悉的就是Github了,Github实际上就相当与一

2016-04-30 15:22:34 2307

原创 Git学习8:Git分支操作

认识分支Git中分支管理是Git的一大特色,由于在实际项目开发中的也确定性以及需求变更的复杂性,所有的开发都集中在一条分支上开发势必造成开发与维护成本的提高。以软件项目开发为例,由于开发会有多个开发周期,发布多个软件版本,每个已发布的版本又可能出现Bug,以及适应时代的变化,不断升级软件,推出新功能。这些都是开发中可能出现的情况,试想这些开发都在一个分支(目前是master)上进行开发,那么会严重影

2016-04-29 18:54:27 5981

原创 Git学习7:Git中的里程碑

认识里程碑里程碑就是Git中的tag,tag是与某个具体的提交(commit)关联的,使用里程碑的好处在于可以直观的看到版本的演变历史,而不是简单生硬的commit id。里程碑的命令是git tag,可以创建、删除和查看里程碑。在Git中还有一个git stash命令,用于保存当前的工作进度,相比之下,git stash可以在任何操作之后使用该命令,当需要处理其他操作的时候再接着上次的进度继续操作

2016-04-28 20:27:24 8207

原创 Git学习6:Git冲突模拟与解决

在真实的Git运行环境中,往往涉及多个用户对版本仓库的协作,而每个用户都有一个完整的Git版本仓库副本,所以在把各自的操作结果推送到远程仓库的时候出现冲突的可能性就非常高。在Git中解决冲突的一个优雅方式是:首先通过命令git fetch获取远程仓库最新的修改,然后执行命令git merge将本地的操作结果(实际上就是一个commit)与远程仓库的修改(远程仓库最新的commit)进行合并,如果在合

2016-04-28 16:31:15 10272 1

原创 Git学习5:Git常用命令简明用法

不要使用git commit -a该命令可以对本地所有的变更文件(包括对本地修改和删除的文件)执行提交操作,但是不包括未被版本库跟踪的文件。git命令补充说明显示.git目录所在的位置git rev-parse --git-dir显示工作区的位置git rev-parse --show-toplevel对全局配置文件进行编辑git config -e --global删除全局配置文件对user.na

2016-04-27 15:52:44 7083

原创 Git学习4:常用命令小结

由于Git仓库是将工作区和版本库放在一起的,所以本地可以完成绝大部分的操作,在本地仓库已经完成了所有需要的更新后,才能把本地仓库同步到远程仓库,实现异地备份和同步。博主的个人博客就是使用Git实现异地备份与同步的,Git命令的强大功能令我着迷,所以在这篇文章将一些在日常工作中经常使用的部分Git命令做一个小结。这篇文章不会详细区介绍每个Git命令的执行过程,只是将一些使用到的命令做一个汇总。关于Gi

2016-04-27 15:25:35 8805 3

原创 Git学习3:理解工作区和暂存区

在Git学习过程中,遇到了如下几个概念:工作区、暂存区和版本库。刚开始觉得Git不就是一个版本控制系统嘛,搞这么多概念干嘛。实际上正是这些概念,让Git的版本控制更加便捷和高效。而Git相比其他版本控制系统的一个不同是暂存区,实际上如果理解了暂存区,对Git的其他命令理解会很快。工作区:简单理解就是需要进行版本的某个文件夹(假设为demo),这个文件夹有一些特殊之处——多了.git这个隐藏的文件夹版

2016-04-26 19:24:28 5256

原创 Git学习2:为什么工作区目录下有.git目录

SVN等版本控制系统的缺陷在通过git init命令后在当前目录出现.git目录,该目录默认是隐藏的,需要关闭显示隐藏文件才能看到。实际上执行git init命令后,当前目录就成为了工作区(工作区可以理解为操作本地仓库的车间),而且,可以发现如果继续在工作区进行创建其他的文件夹文件等操作,.git目录只有一个。不同于SVN、CVS等版本控制系统,以SVN为例,SVN会在每个子目录下面创建.svn文件

2016-04-24 16:16:36 3692

原创 Git学习1:初识Git

认识Git其实学习Git已经有一段时间了,但是一直不知道怎么把学的东西整理出来并写成博客。这个系列的博客不会详尽将Git的使用展现出来,毕竟已经有比较经典的Git教程了。本着实用的原则,会先将Git的一些概念做一个介绍,然后对在使用Git过程中常用的命令做一个深入的解释,所谓知其然知其所以然。Git是Linux之父Linus的第二个伟大的作品(第一个大家都懂的)。在Git出现之前,SVN占据了版本控

2016-04-24 15:30:19 2921

转载 程序员需要具备的基本技能

软件开发是一个跨度很大的技术工作,在语言方面,有C,C++,Java,Ruby等等等等,在环境方面,又分嵌入式,桌面系统,企业级,WEB,基础系统,或是科学研究。但是,不管是什么的情况,总是有一些通用的基本职业技能。这些最基本的职业技能通常决定了一个程序员的级别,能否用好这些技能,直接关系到了程序员的职业生涯。很多程序新手也是因为缺少、达不到或是不熟悉在这些基本技能,所以,他们需要有老手带,需要努力

2016-04-18 16:55:43 1087

转载 李开复:算法的力量

李开复:算法的力量算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是

2016-04-18 16:28:39 1424

原创 Java并发编程系列文章目录帖及源码

为了方便对并发系列的文章进行更好的阅读,楼主在这里根据学习的顺序对文章了进行了整理,主要有两个目的:日后需要回顾这部分的知识也更方便阅读;增加新的文章的时候对文章的深度和难度也有一个了解。所以本着从入门到初步掌握(还没到精通的程度)并发编程的系列知识原则,汇总的文章目录如下:1、并发机制的底层原理2、重排序与顺序一致性3、锁与volatile的内存语义 4、happens-before原则5、队列

2016-04-18 15:48:02 3543 4

原创 Java NIO系列2:NIO概述

基于NIO的IO与之前的BIO有所不同,NIO的核心部分主要由三个类组成:Channel、Selector和Buffer。三者的之间的关系可以这样理解:现在假设有两个进程需要通信,进行A首先将数据传到进程A所在的缓冲区(位于操作系统用户空间的缓冲区),然后缓冲区将数据释放到通道中,数据流经通道,之后将通道的数据排出到进程B所在的缓冲区,进程B的程序代码就可以对进程B所在的缓冲区的数据进行一系列的操作

2016-04-18 15:01:36 3055

原创 Java NIO系列1:从操作系统的角度剖析I/O

认识IO的本质一、IO对性能的影响首先来理解下IO对程序性能的影响:从上面的表中可以得出的结论是:处理时间与IO时间对吞吐率的影响:把单位处理时间减半,仅能提高吞吐率2.2%。而仅仅缩短I/O延迟10%,就可使吞吐率增加9.7%;把I/O时间减半,吞吐率几乎翻番。二、理解BIO的局限性BIO,也称为阻塞IO,是在jdk1.4之前使用的IO模型,BIO的局限可以从下面的叙述中理解:现在大多数基于Jav

2016-04-18 14:05:37 4079

原创 Hexo系列3:博客优化

最近把博客做了一些修改和优化,将做的一些修改记录如下:把侧边栏头像变成圆形,并且鼠标停留在上面发生旋转效果。修改主题文件d:hexo\next\source\css\_common\components\sidebar\sidebar-author.styl中的内容如下.site-author-image { display: block; margin: 0 auto; max-w

2016-04-16 20:46:43 1385

原创 Hexo系列1:从零开始搭建hexo博客

经过一番折腾,终于搭建好了自己的博客网站,结果是美好的,但过程却惨不忍睹。 作为本站的开篇之作,博主我主要想分享一些建站的想法以及一些初略的经验。欢 迎围观,欢迎吐槽。前言github pages是github下一个免费域名空间,可以自动生成项目或者用户的网站作为一门前沿技术,我深知学习 技术的重要性,技术的思考与学习让我产生了撰写博客的想法,之前试过iteye,反 正就是没坚持下去。直到遇

2016-04-15 12:37:41 3345 1

原创 《Servlet与JSP核心编程》读书笔记

虽然Servlet和JSP学习也使用了挺长时间了,但是最近读了下《Servlet和JSP核心编程》这本书,虽然是熟悉的知识,但是仍然有些因为过长时间没使用而忘记了,记下这篇读书笔记,就当是对Servlet和JSP涉及的核心知识点进行一个整理与回顾吧。书中对Servlet与JSP进行了完整的介绍,总体上还是非常基础的,如果是初学者,或者有了一定开发经验的开发人员,都能从书中得到收获。下面的条目是我在阅

2016-04-15 12:07:25 6264 5

原创 Java并发编程系列之三十二:丢失的信号

这里的丢失的信号是指线程必须等待一个已经为真的条件,在开始等待之前没有检查等待条件。这种场景其实挺好理解,如果一边烧水,一边看电视,那么在水烧开的时候,由于太投入而没有注意到水被烧开。丢失的信号指的就是这种情况。创建两个线程分别执行通知和等待方法,并且将执行通知的线程先与执行等待的线程,下面的代码演示了这点:package com.rhwayfun.patchwork.concurrency.r04

2016-04-14 16:35:29 4238

原创 Java并发编程系列之三十一:过早的通知

等待通知机制在前面介绍了等待通知机制,并使用该机制实现了消费者-生产者模式。我们知道,一个因为调用wait的线程会进入等待队列,当有其他的线程通知的时候才会从等待队列中返回,线程状态会变为RUNNABLE。但是,反过来说,如果一个线程从wait方法中返回,是不是就一定意味着线程等待的条件满足了呢?答案是否定的。考虑这样的场景:比如两个人的手机铃声是一样的(音量和类型),那么当两个手机同时响的时候,就

2016-04-14 15:38:39 4052

原创 Java并发编程系列之三十:多线程的代价

线程的简单回顾在操作系统中引入多线程的原因是进程切换的开销太大,进程在进行上下文切换时由于要切换页表,往往伴随者页调度,因此开销比较大,而线程在进行上下文切换时,由于仅涉及与自身相关的寄存器状态和栈的信息(线程的上下文环境主要包含寄存器的值、程序计数器、栈指针),因此开销比较小。所以,充分利用多线程可以提供系统的执行效率以及充分利用资源。在多个线程进行协作完成任务时,由于涉及到资源的共享与数据的同步

2016-04-12 18:37:22 4162

原创 Java并发编程系列之二十九:正确终止与恢复线程(续)

重新认识中断之前在正确终止与恢复线程一文中介绍了使用Thread类的interrupt方法和使用标志位实现线程的终止。由于之前只是简单介绍了jdk默认中断方法的问题,对线程的中断机制没有深入介绍。为了正确终止线程,深刻理解线程中断的本质是很有必要的。Java没有提供可抢占的安全的中断机制,但是Java提供了线程协作机制(之前说的interrupt方法和标志位本质上都属于线程之间协作的手段),但是提供

2016-04-11 19:27:56 3745 4

原创 Hexo系列2:node.js+hexo博客同步与备份

最近考虑把Node.js+hexo搭建的博客备份到云端,然后在另一台电脑同步更新。要实现多机同步与备份,首先需要从云端使用git clone得到网站原始文件,然后在新机器上安装node.js+hexo之后才可以正常使用。我在之前的电脑中把网站的原始文件备份到了oschina云端,然后想在另一台电脑的Ubuntu15.10系统上完成博客的同步更新,由于新电脑没有安装node.js+hexo环境,所以需

2016-04-10 20:31:45 2642

原创 Java并发编程系列之二十八:CompletionService

CompletionService简介CompletionService与ExecutorService类似都可以用来执行线程池的任务,ExecutorService继承了Executor接口,而CompletionService则是一个接口,那么为什么CompletionService不直接继承Executor接口呢?主要是Executor的特性决定的,Executor框架不能完全保证任务执行的异

2016-04-10 17:01:15 15802 6

原创 Java并发编程系列之二十七:ThreadLocal

ThreadLocal简介ThreadLocal翻译过来就是线程本地变量,初学者可能以为ThreadLocal是指一个Thread,其实说白了,ThreadLocal就是一个成员变量,只不过这是一个特殊的变量——变量值总是与当前线程(调用Thread.currentThread()得到)相关联。既然ThreadLocal是一个变量,那么其作用是是什么呢?说得抽象点就是提供了线程封闭性,说得具体点就是

2016-04-08 22:19:25 3287

原创 深入Java集合系列之六:CopyOnWriteArrayList

CopyOnWriteArrayList简介CopyOnWriteArrayList容器是Collections.synchronizedList(List list)的替代方案,CopyOnWriteArrayList在某些情况下具有更好的性能,考虑读远大于写的场景,如果把所有的读操作进行加锁,因为只有一个读线程能够获得锁,所以其他的读线程都必须等待,大大影响性能。CopyOnWriteArray

2016-04-08 16:18:15 5128

原创 Java并发编程系列之二十六:ConcurrentModificationException

在多线程程序的编写中,经常能遇到ConcurrentModificationException这个异常,这个异常的意思是指出现了并发修改的情况,为了降低对程序的性能的影响,Java开发者将捕获的这种错误以“善意”的方式进行提醒。这种异常一般在对容器的元素遍历的过程中出现了对容器的写操作(包括增加、修改和删除操作)时出现。仔细阅读源码就知道,使用迭代器遍历元素时由一个计数器,这个计数器就是为“快速失败

2016-04-08 14:48:35 6712

原创 Java并发编程系列之二十五:线程池

线程池简介在之前介绍Executor框架的文章中对线程池有一个初步的认识,实际上线程池这种设计思想在Java中很普遍,比如JVM中常量池,以及Web开发使用到的数据库连接池。这些池本质上还是Java中的对象池,因为池中存放的都是Java对象。回到线程池,几乎所有需要异步或者执行并发任务的程序都可以使用到线程池。使用线程池带来的好处主要包括以下几个方面: 一,提高资源利用率。由于线程池中的线程使可

2016-04-07 19:50:55 4884 1

原创 Java并发编程系列之二十四:Exchanger

Exchanger是一个线程间交换数据的工具类。Exchanger从字面上可以理解为交换者,是一个可以用于线程间协作的工具类。主要用于线程间的数据交换。Exchanger提供一个同步点,在这个同步点上,两个线程可以交换彼此的数据。这两个线程可以通过exchange方法交换数据,当然存在线程执行不同步的情况,如果第一个线程先到达同步点,那么在第二个线程到达同步点之前,第一个线程会阻塞等待,直到两个线程

2016-04-07 14:41:56 4336

原创 Java并发编程系列之二十三:Semaphore

Semaphore(信号量)是用来控制线程并发数的,如果想对特定资源限制允许访问的线程数,那么就可以使用Semaphore来协调各个线程,从而保证线程合理运行。Semaphore由一个构造方法用来指定资源允许访问的线程数,也称为许可证的数量。使用Semaphore信号量控制并发线程数很简单,只需要在构造方法中执行一个参数就可以,该参数就表示有多少个线程可以并发访问该资源。当需要一个许可证的时候,只需

2016-04-06 16:23:32 4573 4

原创 Java并发编程系列之二十二:CyclicBarrier

CyclicBarrier意为可循环使用的(Cyclic)屏障(Barrier),属于jdk 5新增加的并发工具,需要导入java.util.concurrent.CylicBarrier才能使用。CyclicBarrier适用于这样的场景:多线程并发执行,已经执行完的线程需要阻塞等待其他线程执行完毕,最后执行主线程的工作。听起来非常类似CountDownLatch,CyclicBarrier与Co

2016-04-06 14:49:26 4941

原创 Java并发编程系列之二十一:CountdownLatch

CountDownLatch是JDK提供的并发工具包,理解并掌握这些工具包的使用有助于简化特定场景下的编程。就CountDownLatch而言,允许一个或者多个线程等待其他线程完成操作。等待其他线程完成不是与Thread.join()方法类似吗,因为Thread.join()就是让当前的线程等待join的线程执行完毕再继续执行。这里基于一个简单的需求实现CountDownLatch的功能:读取某目录

2016-04-06 13:57:58 4163

原创 Java并发编程系列之二十:Fork/Join框架

Fork/Join框架简介 Fork/Join框架是Java 7提供的用于并行执行任务的框架。具体是把大任务切分为小任务,再把小任务的结果汇总为大任务的结果。从这两个单词的角度分析,Fork是分叉的意思,可以引申为切分,Join是加入的意思,可以引申为合并。Fork的作用是把大任务切分为小任务,Join则是把这些小任务的执行结果进行合并的过程。以计算1+2+3+4为例,假设阈值是2,那么Fork会

2016-04-06 12:11:24 7172

原创 Java并发编程系列之十九:原子操作类

原子操作类简介当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况。这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量。然而,从jdk 5之后,提供了粒度更细、量级更轻,并且在多核处理器具有高性能的原子操作类。因为原子操作类把竞争的范围缩小到单个变量上,这可以算是粒度最细的情况了。原子操作类相当于泛化的volatile变量,

2016-04-05 22:22:34 14441

原创 Java并发编程系列之十八:读写锁

在之前提到的synchronized的互斥锁和ReentrantLock都属于排他锁,这些锁在同一时刻只能允许一个线程进行访问。而读写锁允许同一时刻有多个读线程进行访问,但是在有写线程的时候,所有的读线程和其他所有的写线程都将阻塞。读写锁维护了一对锁,一个读锁和一个写锁,这种分离提高了并发性,因为在使用排他锁的时候,读读线程也是被阻塞的,相比之下确实提高了并行度。读写锁除了保证写操作对读操作的可见性

2016-04-05 16:20:53 5053

原创 Java并发编程系列之十七:Condition接口

通过前面的文章,我们知道任何一个Java对象,都拥有一组监视器方法,主要包括wait()、notify()、notifyAll()方法,这些方法与synchronized关键字配合使用可以实现等待/通知机制。而且前面我们已经使用这种方式实现了生产者-消费者模式。类似地,Condition接口也提供类似的Object的监视器的方法,主要包括await()、signal()、signalAll()方法,

2016-04-05 14:50:55 7276

原创 Java并发编程系列之十六:Lock锁

Lock锁简介Lock锁机制是JDK 5之后新增的锁机制,不同于内置锁,Lock锁必须显式声明,并在合适的位置释放锁。Lock是一个接口,其由三个具体的实现:ReentrantLock、ReetrantReadWriteLock.ReadLock 和 ReetrantReadWriteLock.WriteLock,即重入锁、读锁和写锁。增加Lock机制主要是因为内置锁存在一些功能上局限性。比如无法中

2016-04-05 13:50:42 4801

原创 Java并发编程系列之十五:Executor框架

Java使用线程完成异步任务是很普遍的事,而线程的创建与销毁需要一定的开销,如果每个任务都需要创建一个线程将会消耗大量的计算资源,JDK 5之后把工作单元和执行机制区分开了,工作单元包括Runnable和Callable,而执行机制则由Executor框架提供。Executor框架为线程的启动、执行和关闭提供了便利,底层使用线程池实现。使用Executor框架管理线程的好处在于简化管理、提高效率,还

2016-04-04 17:55:04 9222 3

原创 Java并发编程系列之十四:阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞地插入和移除方法。支持阻塞插入的方法是指当队列满时会阻塞插入元素的线程,直到队列不满;支持阻塞移除的方法是指当队列为空时获取元素的线程无法继续获取元素直到队列不空。可以发现阻塞队列非常适合消费者和生产者场景下进行使用,生产者生产数据就是向阻塞队列中插入元素,消费者消费数据就是从阻塞队列中移除元素。Java提供了

2016-04-04 15:48:08 1652

原创 Java并发编程系列之十三:生产者-消费者模式

生产者-消费者模式指的是:生产者和消费者在同一个时间段共用同一段空间,在这段时间内,生产者负责往存储空间生产数据,而消费者则负责消费数据。实际上存在很多类似的场景:消息中间件就可以看做这种模式的应用,客户端请求负责把请求消息发送给消息中间件,然后由服务器负责从消息中间件获取请求并进行响应;还有网络编程中Socket也可以看做是生产者消费者模式的应用,etc。为了简化问题的研究,现在仅仅考虑一种简单的

2016-04-04 13:46:14 5134

原创 Java并发编程系列之十二:死锁、饥饿和活锁

死锁发生在一个线程需要获取多个资源的时候,这时由于两个线程互相等待对方的资源而被阻塞,死锁是最常见的活跃性问题。这里先分析死锁的情形:假设当前情况是线程A已经获取资源R1,线程B已经获取资源R2,之后线程A尝试获取资源R2,这个时候因为资源R2已经被线程B获得了,所以线程A只能阻塞直到线程B释放资源R2。另一方面,线程B在已经获得资源R2的前提下尝试获取由线程A持有的资源R1,那么由于资源R1已经被

2016-04-03 18:28:02 9309 3

空空如也

空空如也

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

TA关注的人

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