51dev.com IT技术开发者社区

51dev.com 技术开发者社区

CompletionService异步非阻塞获取并行任务执行结果

CompletionService异步非阻塞获取并行任务执行结果

  《Java并发编程实践》一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话:  "如果向Executor提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务关联的Future,然后反复使用get方法,同时将参数timeout指定为0,从...

ConcurrentHashMap底层实现原理(JDK1.8)源码分析

ConcurrentHashMap底层实现原理(JDK1.8)源码分析

  ConcurrentHashMap相比HashMap而言,是多线程安全的,其底层数据与HashMap的数据结构相同,数据结构如下:    说明:ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。  1、类的继承关系 publiccla...

CopyOnWriteArrayList实现原理及源码分析

CopyOnWriteArrayList实现原理及源码分析

  我们都知道,集合框架中的ArrayList是非线程安全的,Vector虽是线程安全的,但由于简单粗暴的锁同步机制,性能较差。而CopyOnWriteArrayList则提供了另一种不同的并发处理策略(当然是针对特定的并发场景)。  很多时候,我们的系统应对的都是读多写少的并发场景。CopyOnWriteArrayL...

HashMap闭环(死循环)的详细原因(转)

HashMap闭环(死循环)的详细原因(转)

为何出现死循环简要说明  HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%。  HashMap采用链表解决Hash冲突。因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产...

JAVA栅栏和闭锁的区别

JAVA栅栏和闭锁的区别

  闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。即,一组线程等待某一事件发生,事件没有发生前,所有线程将阻塞等待;而事件发生后,所有线程将开始执行;闭锁最初处于封闭状态,当事件发生后闭锁将被打开,一旦打开,闭锁将永远处于打开状态。  闭锁CountDownLatch唯一的...

项目中常用的19条MySQL优化

项目中常用的19条MySQL优化

  做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。  下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方...

Vector、HashTable线程不安全示例

Vector、HashTable线程不安全示例

下面这样写法是Vector线程不安全的写法:importjava.util.Vector;publicclassTest{privatestaticVector<Integer>vector=newVector<Integer>();publicstaticvoidmain(String[]ar...

红黑树原理图示详解(转)

红黑树原理图示详解(转)

  我们知道ALV树是一种严格按照定义来实现的平衡二叉查找树,所以它查找的效率非常稳定,为O(logn),由于其严格按照左右子树高度差不大于1的规则,插入和删除操作中需要大量且复杂的操作来保持ALV树的平衡(左旋和右旋),因此ALV树适用于大量查询,少量插入和删除的场景中  那么假设现在假设有这样一种场景:大量查询,大...

B树与B+详解

B树与B+详解

  动态查找树主要包括:二叉查找树,平衡二叉树,红黑树,B树,B-树,查找的时间复杂度就为O(log2N),通过对数就可以发现降低树的深度就会提高查找效率。在大数据存储过程,大量的数据会存储到外存磁盘,外存磁盘中读取与写入某数据的时候,首先定位到磁盘中的某一块,这就有个问题:如何才能有效的查找磁盘中的数据呢,这就需要一...

处理器拦截器(HandlerInterceptor)详解(转)

处理器拦截器(HandlerInterceptor)详解(转)

SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。  1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计、计算PV(PageView)等等。  2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。  3、性能监控...

过滤器(Filter)与拦截器(Interceptor )区别

过滤器(Filter)与拦截器(Interceptor )区别

  Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response...

Redis和MemCache静态Map做缓存区别

Redis和MemCache静态Map做缓存区别

  本地缓存:使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。  分布式缓存:使用redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致...

Redis缓存策略设计及常见问题

Redis缓存策略设计及常见问题

  缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化。缓存的收益和成本分析  下图左侧为客户端直接调用存储...

@ComponentScan注解及其XML配置

@ComponentScan注解及其XML配置

  开发中会经常使用包扫描,只要标注了@Controller、@Service、@Repository,@Component注解的类会自动加入到容器中,ComponentScan有注解和xml配置两种方式。  @ComponentScan包含过滤和排除过滤  ComponentScan.Filter[]includeF...

MySQL时间类型及获取、展示处理

MySQL时间类型及获取、展示处理

  mysql所支持的日期时间类型有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。  几种类型比较如下:日期时间类型占用空间日期格式最小值最大值零值表示 DATETIME 8bytes YYYY-MM-DDHH:MM:SS 1000-01-01...