static 关键字
静态变量:属于类,随类存储在方法区,而不随对象存储在堆区,在访问静态变量的时候,建议是通过类名来访问(所以又叫作类变量);
静态方法:属于类
静态块:类加载的时候调用;
静态内部类:不能访问外部类的实例成员,只能访问外部类的静态成员,外部类的所有都可以访问静态内部类。
泛型
泛型的本质是参数化类型,Java 中的泛型是一种伪泛型,基于类型擦除来实现的。比如 字符串数组和整数数组,在 JVM 中二者通过 getClass 的到的是相等的。
List<?> 类型通配符
List<? super T> 泛型必须是 T 的父类
List<? extends T> 泛型必须是 T 的子类
多线程的创建方法
创建多线程的方法:继承 Thread 类并重写 run 方法;实现 runnable 接口,并且通过该实现 runnable 接口的对象来构造 thread 的对象,然后启动 thread;实现 Callable 接口
多线程的常用方法
静态方法
sleep():休眠;currentThread():当前正在执行的线程;interrupted() 是否被中断;yield() 放弃处理器;
实例方法
getId, getName
interrupt: 使线程中断;join 等待线程终止;setPriority 设置优先级
线程同步
同步方法,synchronized 锁住整个方法;同步代码块,不必要同步住整个方法,仅仅把关键部分锁住即可;volatile 关键字:volatile 关键字并不能保证原子性,只能保证每次使用的值,都是最新的,但是在使用的过程中,仍然有可能被抢夺 CPU,所以说,volatile 关键字只能保证可见性,并不能保证操作的原子性;原子变量
多线程通信
wait(): 释放对象锁,并进入阻塞; notify():唤醒一个正在等待对象锁的线程; notifiall():唤醒所有正在等待对象锁的线程;阻塞队列 & 就绪队列
sleep 和 wait 的区别
sleep 静态方法,wait 成员方法;sleep 不会释放锁,wait 会释放锁;
线程按顺序执行
Join 方法,join方法是Thread类中的一个方法,该方法的定义是等待该线程执行直到终止。其实就说join方法将挂起调用线程的执行,直到被调用的对象完成它的执行
线程阻塞的方法
sleep 主动放弃处理器资源,进入阻塞状态;
获取锁失败,会进入阻塞状态;
等待 notify 时候,也会阻塞;
suspend 挂起的时候,也会阻塞
乐观锁与悲观锁
悲观锁:假设最坏的情况,每次都加锁,通过 synchronized 关键字或者 Lock 接口实现;
乐观锁:拿的时候不会上锁,但是在更新的时候会检查一下别人有没有修改,这种比较适用于多读的场景;
锁升级
无锁、偏向锁、重量级锁、轻量级锁
进程间通信的方式
共享内存、管道、socket、信号量
进程状态
创建、就绪、执行、阻塞、终止
死锁的产生条件
互斥、不剥夺、请求和保持、循环等待