自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(613)
  • 资源 (17)
  • 收藏
  • 关注

原创 Java 多线程 --- FutureTask 源码分析

在多线程编程中,创建线程可以直接继承Thread,也可以实现Runnable接口。但是这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,FutureTask,通过它们可以在任务执行完毕之后得到任务执行结果,

2018-01-18 20:07:07 491

原创 Java 并发 --- ConcurrentSkipListMap源码分析

在学习ConcurrentSkipListMap 之前 我们需要先来学习一种随机化的数据结构–跳跃表(skip list) 对于数组的查找可以有很多方法,如果是有序的,那么可以采用二分查找,二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存。这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了。 对于链表而言,不能进行随机访问,也就是说不能单纯的

2018-01-16 19:14:39 592

原创 Java 并发 --- Thread 源码浅析

在多线程编程中,如果要使用线程来执行任务,那么最简单的方式就是使用Thread类来创建一个线程,当然也可以使用线程池的方式。 线程是在进程中执行的单位,线程的资源开销相对于进程的开销是相对较少的,所以我们一般创建线程执行,而不是进程执行。 本文不是学习Thread的使用,而是通过Thread类来一探线程从创建到结束的过程。继承体系 Thread类实现了Runnable接口,因此Thr

2018-01-08 14:10:33 600

原创 Java 并发 --- CopyOnWriteArrayList 源码分析

CopyOnWriteArrayList,顾名思义,Write的时候总是要Copy,读写分离的思想,通俗地讲,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器复制出一个新的容器,然后在新的容器里添加元素,添加玩元素之后再讲原来容器的引用指向新的容器。

2018-01-04 12:49:30 348

原创 Java 并发 --- 阻塞队列总结

前面我们把阻塞队列学习完了,现在过段时间来进行总结一下,也算是复习回顾知识,比较才能明白使用的场景。

2017-12-27 20:15:49 1233

原创 Java 并发 --- 非阻塞队列之ConcurrentLinkedQueue源码分析

在并发编程中,有时候需要使用线程安全的队列,如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法,在前面我们逐一分析过阻塞队列,这篇文章过后,会写篇关于阻塞队列的总结,也算是回顾知识,非阻塞的实现方式则可以使用循环cas的方式来实现,对于循环cas的算法,都已经遇到多了,在阻塞队列中,也有使用循环cas的队列,比如:SynchronousQueue

2017-12-19 19:48:53 627 2

原创 Java集合之ConcurrentHashMap源码分析

注:本文源码是JDK8的版本ConcurrentHashMap 介绍(jdk 1.8)ConcurrentHashMap是HashMap的升级版,HashMap是非线程安全的集合,ConcurrentHashMap则可以支持并发操作, HashMap是我们平时开发过程中用的比较多的集合,ConcurrentHashMap就算用得少,但是听过的肯定不少,一起来研究研究吧

2017-12-16 18:37:19 2013 1

原创 Java 并发 --- Exchanger源码分析

Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据。

2017-12-07 20:42:55 2953 3

原创 Java 并发 --- Semaphore源码分析

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,可以用于做流量控制,特别是公共资源有限的应用场景,如果熟悉操作系统的概念,那么肯定对这么名词不陌生,当初在学习Linux进程通信中,也简单的学习过,今天再次接触到Semaphore。

2017-12-03 16:21:18 398

原创 Java 并发 --- CyclicBarrier源码分析

CyclicBarrier 介绍(jdk 1.8)CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier),它的功能是让一组线程到达一个屏障(也就叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

2017-12-02 15:21:01 333

原创 Java 并发 --- CountDownLatch源码分析

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 实现某个线程等待其余线程完成任务的最简单做法是使用join()方法(join 用于当前执行线程等待被join 线程执行结束),其实现原理就是不停的检查被join 线程是否存活,如果被join 线程存活,则继续让当前线程等待。

2017-11-27 21:30:26 391

原创 Java集合之HashSet,LinkedHashSet源码分析

HashSet,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,因此如果明白了HashMap那么HashSet也就自然明白

2017-11-21 20:49:51 410

原创 Java 并发 --- 阻塞队列之LinkedBlockingDeque源码分析

LinkedBlockingDeque是基于双向链表的双端有界阻塞队列,默认使用非公平ReentrantLock实现线程安全,默认队列最大长度都为Integer.MAX_VALUE;不允许null元素添加;双端队列可以用来实现 "窃取算法" ,两头都可以操作队列,相对于单端队列可以减少一半的竞争。

2017-11-20 14:21:38 1628

原创 Java集合之TreeMap源码分析

在jdk 1.8 中 HashMap是数组+链表+红黑树实现的,当hash表某个位置上的元素个数超过某个阀值过后就采用红黑树结构,否则采用链表结构,在HashMap中元素 相对插入顺序是无序的,也就是说其遍历顺序不可预测。LinkedHashMap是基于HashMap实现的,使用了双向链表,保证按照插入顺序或者访问顺序进行迭代,TreeMap 支持按键值进行升序访问,或者由传入的比较器(Comparator)来控制。

2017-11-19 20:01:08 1150

原创 Java 并发 --- 阻塞队列之LinkedTransferQueue源码分析

在前面我们分析了SynchronousQueue,SynchronousQueue这个阻塞队列很特殊,也很抽象,经过一番较量后,终于还是把它拿下,今天我们来看另一个也很抽象的阻塞队列,和SynchronousQueue有很大的相似之处,个人感觉类似扩展的SynchronousQueue。因此在阅读本文之前,最好对SynchronousQueue有比较好的认识

2017-11-16 19:30:46 967

原创 Java集合之LinkedHashMap源码分析

前面我们分析了HashMap,HashMap在jdk 1.8中是红黑树和链表实现的,具有很好的查询性能,但是HashMap存储元素是无序,这里的无序指的是插入的顺序和遍历的顺序不一致,无法预测遍历的顺序,今天我们来看Map的另一个实现类LinkedHashMap。 LinkedHashMap继承自HashMap,提供可以预测的迭代访问,即按照插入序 或访问序。

2017-11-10 16:32:21 1249 2

原创 Java 并发 --- 阻塞队列之SynchronousQueue源码分析

与前面分析的几个阻塞队列不一样(ArrayBlockingQueue,PriorityBlockingQueuey),SynchronousQueue 很抽象,前面我们看到的阻塞队列都是真真实实的队列,而且从队列的数据结构上,我们都不难进行分析,只要知道了其存储的数据结构,然后再从方法上很容易进行分析,同时使用了可重入锁来控制数据的安全,锁使得线程安全实现起来如此的简单,而SynchronousQueu使用非锁结构。

2017-11-06 18:01:35 1775 6

原创 Java 并发 --- 阻塞队列之DelayQueue源码分析

DelayQueue 是一个支持延时获取元素的无界阻塞队列,队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延时期满时才能从队列中提取元素。

2017-10-29 15:16:22 4184 4

原创 Java 并发 --- 阻塞队列之PriorityBlockingQueuey源码分析

在学习完ArrayBlockingQueue,LinkedBlockingQueue 之后,应该对阻塞队列有了一个比较清晰的认识,今天我们来学习另一个阻塞队列PriorityBlockingQueue。PriorityBlockingQueue 介绍PriorityBlockingQueue 是一个支持优先级的无界阻塞队列,默认情况下元素采取自然顺序升序排列

2017-10-27 22:17:17 1261 2

原创 Java集合之HashMap源码分析

HashMap应该是使用的一个频率很高的一个集合了,平时用得很多,但是了解并不深入,一起来看看HashMap的结构实现和功能原理。 HashMap(jdk 1.8)HashMap是Java的Map家族中一个普通成员,它根据键的hashCode值存储数据,具有很快的访问速度,但遍历顺序却是不确定的,也就是说插入顺序和遍历顺序没有什么关系的

2017-10-23 21:05:52 970

原创 Java 并发 --- 阻塞队列之LinkedBlockingQueue源码分析

HashMap应该是使用的一个频率很高的一个集合了,平时用得很多,但是了解并不深入,一起来看看HashMap的结构实现和功能原理。 HashMap(jdk 1.8)HashMap是Java的Map家族中一个普通成员,它根据键的hashCode值存储数据,具有很快的访问速度,但遍历顺序却是不确定的,也就是说插入顺序和遍历顺序没有什么关系的,究其原因在于元素的存储结构,后面我们将会学习到,H

2017-10-17 22:16:16 1397

原创 Java 并发 --- 阻塞队列之ArrayBlockingQueue源码分析

队列是一种FIFO(先进先出)数据结构,在前面我们知道分析过LinkedList的源码,LinkedList可以作为一般的队列使用,既然有阻塞队列,那么肯定就和一般的队列是有不一样的地方,并且使用场景也可能不一样,一起来探究一下阻塞队列的源码。在看本文之前,要有 AbstractQueuedSynchronizer,ReentrantLock,Condition的知识。

2017-10-14 21:39:45 1029

原创 Java集合之Vector源码分析

前面,我们已经学习了ArrayList,LinkedList,我们接着按着集合框架图学习–Vector。 Vector和ArrayList大同小异,都是动态数组,Vector和ArrayList差别很小,因此本文不会按照ArrayList那样分析,只是简单揭开Vector的面纱.

2017-10-12 20:47:05 691

原创 Java 并发 ---ReentrantReadWriteLock源码分析

在我们分析了AbstractQueuedSynchronizer(同步器)之后,分析了ReentrantLock,ReentrantLock内部组合了同步器来完成同步操作,从源码中我们知道ReentrantLock是排它锁(独占锁),这些锁在同一时刻只允许一个线程进行访问,今天我们来分析基于同步器实现的另一个同步组件ReentrantReadWriteLock(读写锁)。本文需要有同步器知识的基础。

2017-10-08 20:38:24 930 1

原创 Java集合之LinkedList源码分析

前面,我们已经学习了ArrayList,我们接着学习集合框架——LinkedList。LinkedList(jdk 1.8)介绍LinkedList是基于链表实现的,是一种线性的存储结构。 LinkedList是一种双向非循环链表:链表中任意一个存储单元都可以通过向前或者向后寻址的方式获取到其前一个存储单元和其后一个存储单元继承体系

2017-10-06 14:33:23 960

原创 Java 并发 ---ReentrantLock源码分析

在前面我们分析了AbstractQueuedSynchronizer(同步器),通过内部使用同步器可以实现线程之间的同步,今天我们就来看看基于同步器的锁ReentrantLock是如何实现的。

2017-10-05 18:15:25 710

原创 Java集合之ArrayList源码分析

集合是Java中非常重要而且基础的内容,平时我们使用得最多,其用法也很简单,会使用一个,基本其它就很easy了,得益于集合框架的设计,既然第一步使用已经会了,那么还是有必要深入了解一下,学习其设计技巧,理解其本质,这样不仅会用,还会用得更好,有了更深层次的理解,那么使用过程中都很明白,而不是乱用一通,如果出现问题,也容易排查,今天我们就开始Java 集合框架的探险之旅。ArrayListArrayL

2017-09-26 21:02:54 831 1

原创 亲自动手画红黑树

在前面我们学习了平衡二叉树,伸展树,今天我们来看看另外一种平衡二叉树—红黑树,本来这篇博客早在一年前就该写的,后来发生了太多故事,博客停止了更新了一年,如今又有了最初的斗志,决定好好把博客写下去,对知识的梳理的同时,也不断巩固。 对于各种平衡树,我只能进行简单的理解和实现,无法涉及太多的应用,主要的还是本身自己知识广度和深度有限,不过我相信:不积跬步,无以至千里 本文主要参考了算法导论一书...

2017-09-16 23:11:35 3883 2

原创 Java 并发 ---ThreadLocal源码分析

Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。

2017-09-11 22:33:12 761

原创 Java 并发 ---中断机制

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。对中断本身最好的理解应该是:它并不会真正中断一个正在运行的线程;它仅仅是发出中断请求,线程自己会在下一个方便的时刻中断自己

2017-09-06 22:49:41 1071

原创 Java 并发 ---AbstractQueuedSynchronizer-共享模式与Condition

上文我们分析了AbstractQueuedSynchronizer独占模式的acquire实现流程,接下来继续看一下AbstractQueuedSynchronizer共享模式acquire的实现流程。可以对比独占模式acquire和共享模式acquire的区别,加深对于AbstractQueuedSynchronizer的理解。共享式同步状态的获取同样在开始前,先大概看一下怎么使用?

2017-08-31 00:09:09 1618 1

原创 Java 并发 ---AbstractQueuedSynchronizer(同步器)-独占模式

前面我们了解到可以通过synchronized关键字实现锁功能,使用该关键字不需要我们显式的获取和释放锁,操作很方便简单,但是如果我们需要对锁进行操作或者干预,那么这个是没有办法的。 在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,并发包中新增了Lock(和相关实现类)用来实现锁功能

2017-08-19 23:45:01 4270 1

原创 Java 并发---解读volatile synchronized

volatile在多处理器开发中保证了共享变量的可见性,可见性的意思就是说当一个线程修改一个共享变量时,另一个线程能读到这个修改的值 volatile它不会引起线程上下文的切换和调度。

2017-07-26 15:24:13 816

原创 Java 并发 ---原子操作的实现原理

并发这块反复研究挺久了,源码也研究了一部分,总觉得缺乏一点认识,想了许久还是总结出来,这样也有助于自己理解原子操作意思为不可被中断的一个或一系列操作。

2017-07-25 18:15:09 3478

原创 poj 2411 Mondriaan's Dream(状态压缩dp)

Mondriaan's DreamDescriptionSquares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use h

2015-11-24 17:27:53 4692

原创 poj 3254 Corn Fields(状态压缩dp)

Corn FieldsDescriptionFarmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on

2015-11-24 12:32:30 1101

原创 poj 2955 Brackets(区间dp)

BracketsDescriptionWe give the following inductive definition of a “regular brackets” sequence:the empty sequence is a regular brackets sequence,if s is a regular brackets sequence, th

2015-11-23 17:29:03 593

原创 hdu 4512 吉哥系列故事——完美队形I(LICS)

吉哥系列故事——完美队形IProblem Description  吉哥这几天对队形比较感兴趣。  有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形:    1、挑出的人保持他们在原队形的相对顺序不变;  2、左右对称,假

2015-11-22 22:02:44 494

原创 hdu 4283 You Are the One(区间dp)

You Are the OneProblem Description  The TV shows such as You Are the One has been very popular. In order to meet the need of boys who are still single, TJUT hold the show itself. The show is

2015-11-15 17:17:27 407

原创 Codeforces Round 580 D. Kefa and Dishes (状态压缩dp)

D. Kefa and Dishestime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputWhen Kefa came to the restaurant and sat

2015-11-15 15:18:56 725

UNIX环境高级编程第二版

UNIX环境高级编程第二版

2015-10-15

TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

2015-10-15

TCP-IP详解卷1:协议

TCP-IP详解卷1:协议,网络协议通常分不同层次进行开发,每一层分别 负责不同的通信功能。一个协议族,比如 TCP/IP,是 一组不同层次上的多个协议的组合。 TCP/IP通常被认 为是一个四层协议系统

2015-10-15

线段树专辑

ACM大牛总结的线段树专辑_超经典的

2014-11-11

STL源码剖析简体中文完整版清晰

学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品位都会获得快速的成长。 本书所呈现的源码,使你踏上了基度山岛。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;你将看到各种算法(排序、查找、排列组合、数据移动与复制技术)的实现;你甚至能够看到底层的memory pook和高阶抽象的traits机制的实现。

2014-11-11

C++标准程序库

C++中的标准程序库是类库和函数的集合,其使用核心语言写成。标准程序库提供若干泛型容器、函数对象、泛型字符串和流(包含交互和文件I/O),支持部分语言特性和常用的函数,如开平方根。C++标准程序库也吸收了ISO C90 C标准程序库。标准程序库的特性声明于std命名空间之中。 标准模板程序库是C++标准程序库的子集,包含容器、算法、迭代器、函数对象等。也有些人使用术语STL代表C++标准程序库。 使用C++标准程序库时,不必加上“.h”。

2014-11-10

ACM培训-动态规划

动态规划算法通常用来解决最优化问题。这些问 题可能存在多个解,每个解具有一个值。我们希 望找到一个具有最优(最大或最小)值的解。在 动态规划算法中,主要关心的是找到一个最优解 和求出最优解的值,而不是找出所有的最优解

2014-11-10

取石子游戏_博弈

一、游戏 游戏A: 1. 甲乙两人面对若干堆石子,其中每一堆石子的数目可以任意确定。例如图 1 所示的初始局面:共 n=3 堆,其中第一堆的石子数 a1=3,第二堆石子数 a2=3, 第三堆石子数 a3=1。两人轮流按下列规则取走一些石子,游戏的规则如下: 2. 每一步应取走至少一枚石子; 3. 每一步只能从某一堆中取走部分或全部石子; � 如果谁无法按规则取子,谁就是输家。 。。。。。。

2014-11-10

空空如也

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

TA关注的人

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