- 博客(15)
- 收藏
- 关注
原创 最长上升子序列问题(LIS)
本文给出两种求解最长上升子序列(LIS)的思路。思路1:设d[i]表示以a[i]为结尾的最长递增子序列的长度,d[i]=max{d[j]+1},其中1算法时间复杂度为O(n^2)。思路2:考虑输入数组中的两个数a[i]和a[j],i设c[k]表示最长递增子序列长度为k时最小a[i]值。算法主要实现过程:1. 设当前已经求出的最长上升子序列的长度为le
2016-07-06 16:44:34
330
原创 ConcurrentHashMap源代码解读
下面从ConcurrentHashMap的创建,获取,添加,删除这4个方面对ConcurrentHashMap进行分析。1 创建下面以ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel)来进行说明。@SuppressWarnings("unchecked")publi
2016-06-25 19:40:39
2184
原创 代理模式与动态代理
代理模式定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。在上图中: - RealSubject 是原对象(本文把原对象称为”委托对象”),Proxy 是代理对象。 - Subject 是委托对象和代理对象都共同实现的接口。 - Request() 是委托对象和代理对象共同拥有的方法。要理解代理模式很简单,其实生活当中
2016-05-05 14:38:11
272
原创 装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
2016-04-22 15:54:26
394
原创 后序遍历二叉树
后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 public static void postOrderStack(Node root){ if(root==null)return; Stack s=new Stack();
2016-04-15 10:47:31
357
转载 EhCache简介
Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从Hibernate的缓存开始的。网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google;对于API,官网上介绍已经非常清楚,请参见官网;但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,
2016-04-13 12:59:30
398
原创 生产者消费者模型
package piped;public class ProducerAndConsumer { public static void main(String[] args) { Depot mDepot = new Depot(100); Producer mPro = new Producer(mDepot); Customer mCus = new Customer(mDe
2016-04-09 23:33:45
315
原创 synchronized的使用总结
一. synchronized的基本使用规则synchronized的基本使用规则可总结为以下3条。 1. 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 2. 当一个线程访问“某对象”的“synchronized方法”或者“sync
2016-04-09 21:24:55
395
原创 详解ThreadPoolExecutor与ScheduledThreadPoolExecutor
一.ThreadPoolExecutor通过Executors,可以创建3种类型的ThreadPoolExecutor。 - FixedThreadPool - SingleThreadExecutor - CachedThreadPool1.FixedThreadPool FixedThreadPool被称为可重用固定线程数的线程池。下面是FixedThreadPool的源代码实现。pub
2016-04-06 20:23:13
5548
原创 Executor使用举例
并行计算求和public class ConcurrentSum { private int coreCpuNum; private ExecutorService executor; private List> tasks = new ArrayList>(); public ConcurrentSum(){ coreCpuNum = Runtime.getRuntime(
2016-04-06 13:11:08
344
原创 Semaphore控制线程并发数
信号量用于控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理使用公用资源。 Semaphore常用于流量控制,特别是公用资源特别有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为那是IO密集型任务,我们可以启动几十个线程并发地读取,但是读取到内存之后,还需要存储到数据库中,而数据库连接的数量非常有限,只有10个,这时我们必须控制只有10个线程同时获取数据库连接
2016-04-03 21:12:21
355
原创 Exchanger用于线程间交换数据
Exchanger是一个用于线程间协作的工具类,用于线程间的数据交换。它提供一个同步点,在这个同步点,两个线程通过exchange方法交换数据。先到达同步点的线程会等待后到达的线程。 应用举例:package piped;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;impor
2016-04-03 16:51:56
330
原创 多线程编程中的等待/通知机制和等待超时模式
1. 等待/通知机制等待/通知机制,是指WaitThread首先获取了对象的锁,然后调用对象的wait()方法,从而放弃了锁进入了对象的等待队列中,进入等待状态。NotifyThread随后获取了对象的锁,并调用对象的notify()或notifyAll()方法,将Wai tThread从等待队列中移到同步队列中,此时等待线程的状态变为阻塞状态。 下面分别针对等待方(消费者)和通知方(生产者)进
2016-03-27 15:51:52
3522
原创 java.lang.Thread.sleep()方法和java.lang.Object.wait()方法之间的区别
java.lang.Thread.sleep()sleep()方法为Thread类定义的静态方法,因此需要通过Thread类调用该方法;调用sleep()方法将会导致当前正在执行线程休眠特定的时间;一般情况下,调用sleep()方法后进入休眠状态的线程并不会释放其持有的对象锁。java.lang.Object.wait()wait()方法是Object类定义的普通方法,因此任何对象都可调用
2016-03-27 15:02:20
567
原创 Java类的加载与初始化
Java类的加载与初始化步骤如下所述:从基类开始进行静态成员初始化;执行main()方法;按照声明顺序先调用基类成员的初始化方法,再调用基类构造器;按照步骤3对导出类先进行成员初始化,再调用构造器。参照以下程序:package polymorphism; class Meal { private static Bread bread = new Bread()
2016-03-27 15:01:34
529
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人