自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 291

原创 ConcurrentHashMap源代码解读

下面从ConcurrentHashMap的创建,获取,添加,删除这4个方面对ConcurrentHashMap进行分析。1 创建下面以ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel)来进行说明。@SuppressWarnings("unchecked")publi

2016-06-25 19:40:39 2118

原创 代理模式与动态代理

代理模式定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。在上图中: - RealSubject 是原对象(本文把原对象称为”委托对象”),Proxy 是代理对象。 - Subject 是委托对象和代理对象都共同实现的接口。 - Request() 是委托对象和代理对象共同拥有的方法。要理解代理模式很简单,其实生活当中

2016-05-05 14:38:11 237

原创 装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2016-04-22 15:54:26 363

原创 后序遍历二叉树

后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 public static void postOrderStack(Node root){ if(root==null)return; Stack s=new Stack();

2016-04-15 10:47:31 332

转载 EhCache简介

Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从Hibernate的缓存开始的。网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google;对于API,官网上介绍已经非常清楚,请参见官网;但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,

2016-04-13 12:59:30 359

原创 生产者消费者模型

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 295

原创 synchronized的使用总结

一. synchronized的基本使用规则synchronized的基本使用规则可总结为以下3条。 1. 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 2. 当一个线程访问“某对象”的“synchronized方法”或者“sync

2016-04-09 21:24:55 367

原创 详解ThreadPoolExecutor与ScheduledThreadPoolExecutor

一.ThreadPoolExecutor通过Executors,可以创建3种类型的ThreadPoolExecutor。 - FixedThreadPool - SingleThreadExecutor - CachedThreadPool1.FixedThreadPool FixedThreadPool被称为可重用固定线程数的线程池。下面是FixedThreadPool的源代码实现。pub

2016-04-06 20:23:13 5439

原创 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 312

原创 Semaphore控制线程并发数

信号量用于控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理使用公用资源。 Semaphore常用于流量控制,特别是公用资源特别有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为那是IO密集型任务,我们可以启动几十个线程并发地读取,但是读取到内存之后,还需要存储到数据库中,而数据库连接的数量非常有限,只有10个,这时我们必须控制只有10个线程同时获取数据库连接

2016-04-03 21:12:21 333

原创 Exchanger用于线程间交换数据

Exchanger是一个用于线程间协作的工具类,用于线程间的数据交换。它提供一个同步点,在这个同步点,两个线程通过exchange方法交换数据。先到达同步点的线程会等待后到达的线程。 应用举例:package piped;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;impor

2016-04-03 16:51:56 313

原创 多线程编程中的等待/通知机制和等待超时模式

1. 等待/通知机制等待/通知机制,是指WaitThread首先获取了对象的锁,然后调用对象的wait()方法,从而放弃了锁进入了对象的等待队列中,进入等待状态。NotifyThread随后获取了对象的锁,并调用对象的notify()或notifyAll()方法,将Wai tThread从等待队列中移到同步队列中,此时等待线程的状态变为阻塞状态。 下面分别针对等待方(消费者)和通知方(生产者)进

2016-03-27 15:51:52 3479 1

原创 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 530

原创 Java类的加载与初始化

Java类的加载与初始化步骤如下所述:从基类开始进行静态成员初始化;执行main()方法;按照声明顺序先调用基类成员的初始化方法,再调用基类构造器;按照步骤3对导出类先进行成员初始化,再调用构造器。参照以下程序:package polymorphism; class Meal { private static Bread bread = new Bread()

2016-03-27 15:01:34 495

空空如也

空空如也

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

TA关注的人

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