0%

Java线程池技术

线程池概述

  • 池化技术应该是最常用的提高程序性能的手段,包括线程池与数据库连接池,常量池等等
  • 创建与销毁线程是比较耗费时间的,不利于处理Java程序的高并发,因此引入线程池,也就是维护一组可用的线程,如果有任务,就立即将线程池的空闲线程分配给任务,提升性能,如果线程池内所有的线程都是忙状态的话,可以将任务放到任务队列,或者创建一个新的线程并放入线程池,用于处理新的任务
阅读全文 »

Atomic原子类的学习

介绍

  • 原子类说简单点就是具有原子/原子操作特征的类

    • 所谓原子操作就是指多线程环境下,一旦开始操作就不会被其他线程干扰的操作
    • 使用原子类的优势在于在对对应的数据进行更新的时候不需要加锁,避免使用synchronized的相对较高的开销,也可以实现线程安全(在没有Atomic原子类时,直接使用synchronized包裹来实现数据更新时的原子性,但是开销比较大,而Atomic的出现就是直接在类的基础上进行改造实现更改的原子性
阅读全文 »

AQS学习

AQS介绍

  • AQS的全称是 AbstractQueuedSychronizer抽象队列同步器,位于juc.locks包下

    • 整个juc.locks.lock接口的实现类基本上除了文章末尾补充的StampedLock之外,其余都是借助AQS实现同步功能
  • AQS 是一个用来构建锁和同步器的框架,比如常见的 ReentrantLock,Semaphore(信号量),其他的诸如ReentrantReadWriteLock,CountDownLatch,FutureTask(jdk1.7) 等等皆是基于 AQS 的。当然,我们自己也能利用 AQS 非常轻松容易地构造出符合我们自己需求的同步器,只要子类实现它的几个protected方法就可以了

    • 所谓同步器就是为了实现线程同步而设计的组件,锁,信号量都可以视为同步器;线程同步的概念就是:线程之间按照一定的顺序执行
    • 并发编程的两大问题
      • 线程通信(数据交互)
      • 线程同步(线程的执行顺序)
    • FutureTask在jdk1.7时依赖AQS构建,在JDK1.8后改为使用CAS+state变量的维护+WaitNode类型的链表来维护等待的线程—-可以说继承了AQS的思想
阅读全文 »

Redis总结

Redis全景图

应用维度

  • 缓存使用
  • 集群运用
  • 数据结构的巧妙使用

系统维度

  • 高性能
    • 线程模型
    • 网络IO模型
    • 数据结构
    • 持久化机制
  • 高可用
    • 主从复制
    • 哨兵集群
    • Cluster分片集群
  • 高拓展
    • 负载均衡
阅读全文 »

概述

如果你要使用线程安全的集合的话, java.util.concurrent 包中提供了很多并发容器供你使用:

  1. 线程安全的Map:ConcurrentHashMap: 可以看作是线程安全的 HashMap
  2. 线程安全的ListCopyOnWriteArrayList:可以看作是线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.
  3. 线程安全的队列
    1. 非阻塞队列ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列
    2. 阻塞队列BlockingQueue: 这是一个接口,直接继承自Queue这个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道
      1. 关于阻塞队列与非阻塞队列的区别
        1. 大致的理解就是,当队列满了或为空时,进行添加或删除操作时,阻塞队列会阻塞操作(一般也会同时提供超时阻塞版本以及非阻塞版本,线程池中三种类型的方法都有使用)或者报异常,并使用线程锁来实现线程安全,适用于生产者与消费者的模型,非阻塞队列则不会阻塞,直接返回操作结果,并且使用CAS保证线程安全,性能比较好
        2. 参考此篇文章
      2. ArrayBlockingQueue
      3. LinkedBlockingQueue
      4. PriorityBlockingQueue
      5. SynchronousQueue
      6. DelayedWorkQueue
  4. 线程安全的跳表:ConcurrentSkipListMap :跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。
    1. 维护元素的顺序
阅读全文 »