一条SQL执行慢的原因 (一)

  |  

原因归类为两种

  • 大多数情况是正常的,只是偶尔会出现很慢的情况

  • 在数据量不变的情况下,这条SQL语句一直以来都执行的很慢

阅读全文

多线程--浅入多线程

  |  

JAVA多线程实现的四种方式

  1. 继承Thread类创建线程
  2. 实现Runnable接口创建线程
  3. 实现Callable接口通过FutureTask包装器来创建Thread线程
  4. 使用ExecutorService、Callable、Future实现有返回结果的线程 线程状态

阅读全文

设计模式(二)

  |  

单例设计模式

一个类在程序的运行过程中,只有一个对象。

比如日历类 Calendar.getInstance()

  • 单例特点

    • 不能让外界创建该类的对象:私有构造方法

    • 单例类本身要负责创建该类的唯一对象。

    • 单例类要提供一个静态公开的方法返回该类的唯一对象。

阅读全文

设计模式(一)

  |  

归类设计模式

大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。

  1. 创建型模式,是对对象创建过程的各种问题和解决方案的总结。

    • 包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。
  2. 结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。

    • 常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)等。
  3. 行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。

    • 比较常见的行为型模式有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)。

阅读全文

NIO相关基础篇(二)-- Linux 网络 I/O模型

  |  

我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer

如下图所示:

整个请求过程为: 用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数据后再响应客户端。

在整个请求过程中,数据输入至buffer需要时间,而从buffer复制数据至进程也需要时间。因此根据在这两段时间内等待方式的不同,I/O动作可以分为以下五种模式

  1. 阻塞I/O (Blocking I/O)

  2. 非阻塞I/O (Non-Blocking I/O)

  3. I/O复用(I/O Multiplexing)

  4. 信号驱动的I/O (Signal Driven I/O)

  5. 异步I/O (Asynchrnous I/O)

本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”。

阅读全文

NIO相关基础篇(一)-- 空间概念

  |  

用户空间以及内核空间概念

我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

阅读全文

IO总结

  |  
  • 传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。

  • 在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式。

  • 在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

阅读全文

ConcurrentHashMap的源码分析

  |  

为什么要使用ConcurrentHashMap

HashMap线程不安全,而Hashtable是线程安全,因为他很直接使用了 synchronized 进行了方法同步,正因此当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下,都要竞争同一把锁,导致效率极其低下。

除了 Hashtable 等同步容器,还提供了所谓的 同步包装器(Synchronized Wrapper) ,我们可以调用 Collections 工具类提供的包装方法,来获取一个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。而在JDK1.5后为了改进Hashtable的痛点,ConcurrentHashMap应运而生。

阅读全文

HashMap的源码分析

  |  

HashMap 内部的结构

HashMap 它可以看作是 数组(Node<K,V>[] table) 和 链表 结合组成的复合结构,数组被分为一个个 桶(bucket),通过哈希值决定了键值对在这个数组的寻址;哈希值相同的键值对,则以链表形式存储,你可以参考下面的示意图。这里需要注意的是,如果链表大小超过阈值(TREEIFY_THRESHOLD, 8),图中的链表就会被改造为树形结构。

阅读全文


Copyright © 2018 - 2020 Kuanger All Rights Reserved.

访客数 : | 访问量 :