1、ReentrantLock介绍

  • 相对于synchronized它具备如下特点:

    • 可中断。
    • 可以设置超时时间。
    • 可以设置为公平锁。
    • 支持多个条件变量。
    • 与synchronized一样,都支持可重入。
Read more »

1、自定义线程池

  • 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。 下面先自定义一个线程池,关键图如下:

Read more »

1、CAS解决线程安全问题

  • java.util.concurrent.atomic包下类都是原子类,原子类都是基于sun.misc.Unsafe实现的, 基本可以分为一下几类:

  • 原子性基本数据类型:AtomicBoolean、AtomicInteger、AtomicLong

  • 原子性对象引用类型:AtomicReferenceAtomicStampedReference、AtomicMarkableReference

  • 原子性数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

  • 原子性对象属性更新:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

    Read more »

1、Java内存模型

  • JMM即Java Memory Model,它定义了主存(即JVM中的方法区和堆区)、工作内存(即JVM中的虚拟机栈)抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。
    • JMM体现在以下几个方面:
      • 原子性-保证指令不会受到线程上下文切换的影响。
      • 可见性-保证指令不会受cpu缓存的影响。
      • 有序性-保证指令不会受cpu指令并行优化的影响。
        Read more »

1、成员变量和局部变量

  • 成员变量和静态变量的线程安全性
    • 如果它们没有共享,则线程安全。
    • 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况。
      • 如果只有读操作,则线程安全。
      • 如果有读写操作,则这段代码是临界区,需要考虑线程安全。
  • 局部变量的线程安全性
    • 局部变量是线程安全的。
    • 但局部变量引用的对象则未必。
      • 如果该对象没有逃离方法的作用访问,它是线程安全的。
      • 如果该对象逃离方法的作用范围,需要考虑线程安全。
        Read more »

1、守护线程

  • 默认情况下,Java进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Slf4j
    public class TestThread {
    public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
    while (true) {
    if (Thread.currentThread().isInterrupted()) {
    break;
    }
    }
    log.debug("结束");
    }, "t1");
    // 设置该线程为守护线程
    t1.setDaemon(true);
    t1.start();

    Thread.sleep(1000);
    log.debug("结束");
    }
    }
Read more »

1、进程和线程

进程

  • 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。
  • 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
  • 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士等)。
Read more »

1、概述

  • 类加载器是JVM执行类加载机制的前提。

  • ClassLoader的作用:

    • ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。
Read more »

1、概述

  • 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。

  • 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段。

Read more »