0%

常见的IO模型

同步与阻塞

  • IO模型是按照同步与阻塞来区分的,所以需要首先理解同步与阻塞的概念—-这部分对于同步与阻塞的概念的理解是很重要的

  • 首先,可以认为一个IO操作包含两个部分:

    • 发起IO请求(阻塞与非阻塞)
      • 在发起IO请求时,对于NIO来说通过channel发起IO操作请求后,其实就返回了,所以是非阻塞,如果发出请求后一直等待结果就是阻塞的
    • 实际的IO读写操作(同步与异步)
      • 在实际的IO读写操作,如果操作系统帮你完成了再通知你,那就是异步,如果发起请求的一方不断的轮询结果并需要自己执行数据从内核态到用户态的转移工作的就叫做同步
阅读全文 »

并发编程

  • 并发编程的三大特性(或者说是实现并发安全的三大特性)

    • 原子性
      • 一个的操作或者多次操作,要么所有的操作全部都得到执行并且不会收到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。synchronizedLock可以保证代码片段的原子性,Atomic原子类可以保证一个变量、数组、对象、对象属性的读写的原子性
        • 注意与同步问题区分,原子性问题不是同步问题
    • 可见性
      • 当一个变量对多线程共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。volatile 关键字可以保证共享变量的可见性,synchronized可以保证整体的可见性,也就是在同步代码块内对共享变量的修改,在退出同步代码快释放锁后立即可见(以上两者使用的其实都是内存屏障)final关键字也可以实现可见性,实现安全发布
    • 有序性
      • 代码在执行的过程中的先后顺序,Java 在编译器以及运行期间的优化,代码的执行顺序未必就是编写代码时候的顺序,并发编程应能保证无论是单线程还是多线程中的指令执行的逻辑顺序与代码编写顺序一致。volatile 关键字可以禁止指令进行重排序优化;synchronized也可以实现有序性,但是其并不是阻止同步代码块内的指令重排序(换句话说就是同步代码快内可能出现指令重排),而是保证同步代码快整体的有序
阅读全文 »

Unsafe类解析

概述

  • Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用
  • 但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。这也是Unsafe类得名的由来
阅读全文 »

Java线程池技术

线程池概述

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

Atomic原子类的学习

介绍

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

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