复习
- 缓冲流:BufferedReader和BufferedWriter在读写的时候提供了缓冲区
- 文件字节流:FileInputStream和FileOutputStream,以字节形式来读写文件
- 转换流:InputStreamReader和OutputStreamWriter,在字节流和字符流之间进行转换的,在转换过程中,需要考虑编码的问题
- RandomAccessFile:在操作文件的时候,会将文件看作是一个大型的字节数组,来对文件进行读写。在使用的时候需要指定模式:"r"、 "rw"、 "rws"、"rwd"
- 枚举:适合于取值固定并且一一列举的场景
线程
- 进程:计算机在执行的任务
线程:进程中包含的小任务
- 在Windows中,一个进程中可以包含1到多个线程。在Linux中,一个进程一般只包含1个线程
- 线程的执行在CPU(中央处理器)核上来执行 - 现在的计算机中,CPU往往是多核的。每一个核不是只有1个线程,而是在执行多个线程。每一个核给线程划分时间片,进行时间片的轮询
- Java中,定义线程的方式有3种
- 定义一个类继承Thread类,需要覆盖其中的run方法,将线程要执行的逻辑覆盖到这个方法中
- 定义一个类实现Runnable接口,需要覆盖其中的run方法
- 定义一个类实现Callable接口(JDK1.5提供),需要覆盖其中的call方法 - 现阶段不要求掌握
- 一个核上的多个线程,是相互抢占的,抢占会发生在线程执行的每一个步骤中
- 因为多个线程之间相互抢占,导致出现了不合法/不合理的数据,这种现象称之为线程的并发安全问题
- 重复数字
- 缺失数字
- 负数
- 锁机制:通过synchronized来将代码括起来,称之为同步代码块
- 同步代码块在使用的过程中,需要指定锁对象 - 锁对象要求所有的线程都是"认识"的:共享资源、当前类的字节码对象、this
- 由于锁之间相互嵌套导致程序既不报错也不继续往下执行,这种现象称之为死锁 - 死锁一旦出现无法解决
- synchronized除了可以修饰同步代码块以外,还可以修饰方法,被synchronized修饰的方法称之为同步方法
- 如果synchronized修饰的是非静态方法,那么此时这个同步方法的锁对象是this
- 如果synchronized修饰的是静态方法,那么此时这个同步方法的锁对象是当前类的字节码对象
- 虽然synchronized可以修饰方法,但是尽量少使用
- 线程的等待唤醒机制:在线程中,可以通过等待唤醒机制来调节线程的执行顺序