自定义博客皮肤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)
  • 资源 (1)
  • 收藏
  • 关注

原创 ConcurrentHashMap源码分析(一)

因为jdk版本的不同,jdk1.8版本中的ConcurrentHashMap与jdk1.6、jdk1.7版本的实现大有不同,所以本篇文章主要对比HashTable和HashMap对jdk1.6、1.7版本的ConcurrentHashMap做一个详细的总结,以后会写文章对ConcurrentHashMap做一个详细的总结。一、设计思路 HashMap:线程不安全的,内部用数组+链表的数据结构存储数

2017-04-25 21:35:34 321

原创 ThreadLocal的局限性——内存泄漏问题

通过前两篇文章,我们了解了ThreadLocal的内部是怎么实现的,那么这样实现ThreadLocal会带来什么问题呢?首先我们先看一张图来理一理Thread和ThreadLocal的关系: ThreadLocal是一个能更够实现线程内数据共享的类,而通过get(Thread t)方法,我们知道实际的数据以键值对的形式保存在Thread的一个叫ThreadLocalMap类型的属性中,而Thr

2017-04-24 17:15:20 485

原创 ThreadLocal源码解析(二)

上一篇文章主要讲述了Thread和ThreadLocal的关系以及ThreadLocal是怎么存储数据的,本文将讲述ThreadLocal中的一个内部类static class ThreadLocalMap,这个类与HashMap类似,但是跟HashMap没有任何关系,甚至与Map都没有关系,我们主要通过源码来看看该类是什么实现这个功能的。1.ThreadLocalMap中有一个内部类Entry :

2017-04-23 20:25:42 214

原创 ThreadLocal源码解析(一)

1.ThreadLocal中涉及到的几个重要类 • Thread:表示一个线程 • ThreadLocal:本文要解析的这个类 • ThreadLocalMap:ThreadLocal类中的一个内部类,这个类相当于一个HashMap类,但是跟HashMap没有任何关系,内部实现跟HashMap类似 • ThreadLocalMap.Entry:把它看成是保存键值对的对象,其本

2017-04-23 19:08:28 245

原创 用HashMap和双链表实现多线程下的LRU缓存算法(java版)

缓存的目的:缓存主要为了保存数据的,在项目中,开启服务器的时候,将访问量大的数据从数据库中查到,放入到缓存中,服务器开启后,用户从前端向后台发送请求,直接从缓存中去取,不用查数据库,加快数据的访问。我的缓存的需求:主要想保存ArticleBean(中有很多属性),加入到缓存的时候按照点击量的降序,定时更新缓存的时候能将按照点击量的降序加入到合适的位置,而查找文章的时候需要根据文章的id直接缓存中去获

2017-04-19 19:07:15 2270 1

原创 用Condition实现线程间高效通信

Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用.举例说明condition的用法: 例子一:

2017-04-18 20:19:29 303

原创 java中sleep()和wait()的区别

这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.区别一: sleep是Thread类的方法,是线程用来控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。通常我们在写demo的时候,用sleep()方法,通常是为了

2017-04-17 10:37:58 396

原创 多线程中的读写锁

在多线程并发的情况下,读线程不会发生冲突,但是多线程同时写的情况下容易发生并发冲突,为了解决这个问题,java中提供了一个读写锁的类。读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候

2017-04-16 16:51:04 1034 1

原创 java中动态代理模实现接口

通常实现接口的方法就是创建他的实现类,让他的实现类去实现接口中具体的方法,本文将介绍另一种实现接口的方式:动态代理模式去实现接口。动态代理实现接口的步骤: 1.创建一个InvocationHandler接口的实现类,这个接口实现类中实现invoke(…)方法,这个方式是被代理类调用他自己的特有对象,都间接的调用了这个方法: public Object invoke(Object proxy, M

2017-04-13 16:47:40 1390

原创 0-1背包问题(java版)

问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装 入背包中物品的总价值最大?对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。` public class PacketQuestion { public

2017-04-12 19:10:16 544

转载 动态规划0—1背包问题

动态规划0-1背包问题 问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。

2017-04-12 19:01:22 242

转载 通过金矿模型介绍动态规划(背包问题)

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!----第一节----初识

2017-04-11 13:32:01 237

原创 java中的线程池

当我们在执行任务的时候去创建线程,这样实现起来非常简单。 但是在并发的线程非常多的时候,并且每个线程执行一个时间很短的任务就结束了,这样频繁的创建线程,大大降低了系统的效率,因为创建线程和销毁线程需要消耗时间和系统的cpu。 java中可以使用线程池是得线程可以复用,就是说完成一个任务,并不销毁,还可以去执行其他的任务。java.uitl.concurrent.ThreadPoo

2017-04-09 10:57:29 273

原创 多个线程之间共享数据

多个线程之间共享数据,首先想到的是将共享数据设置为全局变量,并且用static修饰,但是static修饰的变量是类变量,生命周期太长了,占用内存,本文将介绍三种方法实现多个线程之间共享数据。方法一:多个线程对共享数据的操作是相同的,那么创建 一个Runnable的子类对象,将这个对象作为参数传递给Thread的构造方法,此时因为多个线程操作的是同一个Runnable的子类对象,所以他们操作的是同一

2017-04-06 08:41:44 1942 1

原创 快速排序算法(java版)

一、快速排序算法是对冒泡算法的改进,算法的思想是: 1.每一趟排序选定一个基元素,这一趟排序完成后,比基元素小的元素在基元素的左边,比基元素大的元素在基元素的右边。 2.对基元素左边和右边的元素进行如1的排序 …..循环1、2 直到左边的元素大于右边元素,排序完成。二、快速排序的时间复杂度:O(nlogn)三、快速排序的空间复杂度: 快排使用的

2017-04-05 08:48:25 253

java中的三种代理模式

该资源提供了三种代理模式的使用代码,其中包含每种模式的jar包、具体代码、Demo测试类,详细的注释帮助你来理解。

2017-05-03

空空如也

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

TA关注的人

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