Java基础知识回顾之七 ----- 总结篇 (3)

Hashtable:Hashtable与HashMap类似,可以说是HashMap的线程安全版。不过它是不允许记录的键或者值为null。因为它支持线程的同步,是线程安全的,所以也导致了Hashtale在效率较低。

ConcurrentHashMap: ConcurrentHashMap在Java 1.5作为Hashtable的替代选择新引入的。使用锁分段技术技术来保证线程安全的,可以看作是Hashtable的升级版。

推荐单线程随机查询用HashMap,自然顺序或自定义顺序用TreeMap,插入和删除用LinkedHashMap。
多线程推荐使用ConcurrentHashMap。

Set

Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。因为Set是一个抽象的接口,所以是不能直接实例化一个set对象。Set s = new Set() 这种写法是错误的。

推荐单线程随机查询用HashSet,自然顺序或自定义顺序用TreeSet,插入和删除用LinkedHashSet。

集合更详细的说明:

多线程

多线程是指在同一程序中有多个顺序流在执行。 简单的说就是在一个程序中有多个任务运行。

线程的状态

创建(new)状态: 准备好了一个多线程的对象
就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
运行(running)状态: 执行run()方法
阻塞(blocked)状态: 暂时停止执行, 可能将资源交给其它线程使用
终止(dead)状态: 线程销毁

线程的创建

通过实现 Runnable 接口;

通过继承 Thread 类本身;

通过实现 Callable接口,然后与Future 和创建线程。

注:线程启动的方法是start而不是run。
推荐创建单线程的时候使用继承 Thread 类方式创建,多线线程的时候使用Runnable、Callable 接口的方式来创建创建线程。

线程的常用方法

sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),不会释放对象锁。

join:指等待t线程终止。

yield:暂停当前正在执行的线程对象,并执行其他线程。

setPriority:设置一个线程的优先级。

interrupt:一个线程是否为守护线程。

wait:强迫一个线程等待。它是Object的方法,也常常和sleep作为比较。需要注意的是wait会释放对象锁,让其它的线程可以访问;使用wait必须要进行异常捕获,并且要对当前所调用,即必须采用synchronized中的对象。

isAlive: 判断一个线程是否存活。

activeCount: 程序中活跃的线程数。

enumerate: 枚举程序中的线程。

currentThread: 得到当前线程。

setDaemon: 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)。

setName: 为线程设置一个名称。

notify(): 通知一个线程继续运行。它也是Object的一个方法,经常和wait方法一起使用。

多线程更详细的说明:

多线程中经常会使用这几个关键字synchronizedlockvolatile
synchronized: synchronized是JVM级别的,也就是在运行期由JVM解释的。它是阻塞锁(也就是在同一时间只会有一个线程持有);也是非公平锁(也就是不遵循先来后到的原则,当一个线程A持有锁,而线程B、C处于阻塞状态时,若线程A释放锁,JVM将从线程B、C随机选择一个线程持有锁并使其获得执行权)。可以保证原子性、可见性以及有序性。

lock: lock是通过编码实现的。它是非阻塞锁;也是公平锁。可以保证原子性、可见性以及有序性。相比synchronized,更加灵活和强大。

volatile:轻量级的锁。主要用户保证共享变量对所有线程的可见性,以及禁止指令重排序)。因为无法保证原子性,所以并不能保证线程安全。

线程安全与共享资源
1.局部变量中的基本数据类型(8种)永远是线程安全的。
2.局部变量中的对象类型只要不会被其他线程访问到,也是线程安全的。
3.一个对象实例被多个线程同时访问时,他的成员变量就可能是线程不安全的。

IO流

IO的名称又来是Input与Output的缩写,也就是输入流和输出流。输入流用于从源读取数据,输出流用于向目标写数据。

字符流

字符流有两个抽象类:WriterReader类。
其对应子类FileWriterFileReader可实现文件的读写操作。
BufferedWriterBufferedReader能够提供缓冲区功能,用以提高效率。

字节流

字节流也有两个抽象类:InputStreamOutputStream类。
其对应子类有FileInputStreamFileOutputStream实现文件读写操作。
BufferedInputStreamBufferedOutputStream提供缓冲区功能

推荐读取文本用字符流,读取图片、视频和图片等二进制文件用字节流

IO流更详细的说明:

说起IO流,顺便谈下它的几个孪生兄弟,NIO、BIO和AIO。

IO:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppswd.html