Hashtable:Hashtable与HashMap类似,可以说是HashMap的线程安全版。不过它是不允许记录的键或者值为null。因为它支持线程的同步,是线程安全的,所以也导致了Hashtale在效率较低。
ConcurrentHashMap: ConcurrentHashMap在Java 1.5作为Hashtable的替代选择新引入的。使用锁分段技术技术来保证线程安全的,可以看作是Hashtable的升级版。
推荐单线程随机查询用HashMap,自然顺序或自定义顺序用TreeMap,插入和删除用LinkedHashMap。
多线程推荐使用ConcurrentHashMap。
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方法一起使用。
多线程更详细的说明:
多线程中经常会使用这几个关键字synchronized、lock和volatile。
synchronized: synchronized是JVM级别的,也就是在运行期由JVM解释的。它是阻塞锁(也就是在同一时间只会有一个线程持有);也是非公平锁(也就是不遵循先来后到的原则,当一个线程A持有锁,而线程B、C处于阻塞状态时,若线程A释放锁,JVM将从线程B、C随机选择一个线程持有锁并使其获得执行权)。可以保证原子性、可见性以及有序性。
lock: lock是通过编码实现的。它是非阻塞锁;也是公平锁。可以保证原子性、可见性以及有序性。相比synchronized,更加灵活和强大。
volatile:轻量级的锁。主要用户保证共享变量对所有线程的可见性,以及禁止指令重排序)。因为无法保证原子性,所以并不能保证线程安全。
线程安全与共享资源
1.局部变量中的基本数据类型(8种)永远是线程安全的。
2.局部变量中的对象类型只要不会被其他线程访问到,也是线程安全的。
3.一个对象实例被多个线程同时访问时,他的成员变量就可能是线程不安全的。
IO的名称又来是Input与Output的缩写,也就是输入流和输出流。输入流用于从源读取数据,输出流用于向目标写数据。
字符流字符流有两个抽象类:Writer和Reader类。
其对应子类FileWriter和FileReader可实现文件的读写操作。
BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率。
字节流也有两个抽象类:InputStream和OutputStream类。
其对应子类有FileInputStream和FileOutputStream实现文件读写操作。
BufferedInputStream和BufferedOutputStream提供缓冲区功能
推荐读取文本用字符流,读取图片、视频和图片等二进制文件用字节流。
IO流更详细的说明:
说起IO流,顺便谈下它的几个孪生兄弟,NIO、BIO和AIO。
IO: