线程安全的类
有三个线程安全的类:StringBuffer、Vector、Hashtable
-------------------------------------------------------------------------------------------------------------
StringBuffer类在java.lang包下。该类的父类是Object
该类实现了四个接口Serializable、Appendable、CharSequence、Comparable<StringBuffer>
该类是线程安全,可变的字符序列
StringBuffer跟StringBuilder的用法类似,StringBuffer用于多线程环境
从JDK5版本开始,这个类已经补充了一个设计用于单个线程的等效类即StringBuilder
通常应优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步
--------------------------------------------------------------------------------------------------------------
Vector类在java.util包下,该类实现了4个接口List<E>、RandomAccess、Cloneable、SerializableVector
该类实现了可增长的对象数组,即Vector的底层数据结构是数组,该类跟ArrayList集合的用法类似
从Java2平台开始,该类改进了List接口,使其成为Java集合体系的成员。与新的集合实现不同, Vector是同步的,即Vector是线程安全的,
如果不需要线程安全实现,建议使用ArrayList代替Vector
--------------------------------------------------------------------------------------------------------------
Hashtable类在java.util包下。该类实现了3个接口Serializable、Cloneable、Map<K,V>
该类的直接子类有Properties、UIDefaults
该类实现了一个哈希表,该类的用法跟HashMap集合的用法类似,它将键映射到值,任何非null对象都可以用作键或值
从Java2平台开始,该类被改进以实现Map接口,使其成为Java集合体系的成员。 与新的集合实现不同, Hashtable是同步的,即Hashtable是线程安全的
如果不需要线程安全实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并发实现,则建议使用ConcurrentHashMap代替Hashtable
--------------------------------------------------------------------------------------------------------------
StringBuffer类总结:
1、线程安全,可变的字符序列
2、从JDK5版本开始,该类被StringBuilder替代,因为StringBuilder类支持所有相同的操作,但速度更快,因为它不执行同步
Vector类总结:
1、从Java2平台开始,该类改进了List接口,使其成为Java集合体系的成员。与新的集合实现不同, Vector是同步的,即Vector是线程安全的,
如果不需要线程安全实现,建议使用ArrayList代替Vector
Hashtable类总结:
1、该类实现了一个哈希表,它将键映射到值,任何非null对象都可以用作键或值
2、从Java2平台开始,该类进行改进即实现Map接口,使其成为Java集合体系的成员。 与新的集合实现不同, Hashtable是同步的,即Hashtable是
线程安全的如果不需要线程安全实现,建议使用HashMap代替Hashtable
线程安全类的练习
xxxxxxxxxx
package ch21;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
//线程安全的类:StringBuffer、Vector、Hashtable。通常会在多线程使用,效果其实就是对应StringBuilder、ArrayList、HashMap
//如果不是在多线程,而是在单线程,就推荐使用StringBuilder、ArrayList、HashMap
//注意:本节课不需要运行,主要是理论课
public class a_14_1测试 {
public static void main(String[] args) {
//StringBuffer
StringBuffer sbf = new StringBuffer();//可选中StringBuffer,按Alt+B,查看源码
//会发现源码里面的方法加了synchronize关键字,即那些方法是同步方法,即就是线程安全的
StringBuilder sbd = new StringBuilder();//可选中StringBuilder,按Ctrl+B,查看源码
//会发现源码里面的方法没有加synchronize关键字,即线程不安全
//------------------------------------------------------------------------------------------------------
Vector<String> v = new Vector<String>();//可选中Vector,按Alt+B,查看源码
//会发现源码里面的方法加了synchronize关键字,即那些方法是同步方法,即就是线程安全的
ArrayList<String> array = new ArrayList<String>();//可选中ArrayList,按Ctrl+B,查看源码
//会发现源码里面的方法没有加synchronize关键字,即线程不安全
//-------------------------------------------------------------------------------------------------------
Hashtable<String,String> ht = new Hashtable<String,String>();//可选中Hashtable,按Alt+B,查看源码
//会发现源码里面的方法加了synchronize关键字,即那些方法是同步方法,即就是线程安全的
HashMap<String,String> hm = new HashMap<String,String>();//可选中HashMap,按Ctrl+B,查看源码
//会发现源码里面的方法没有加synchronize关键字,即线程不安全
//--------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------
//对于现在的java发展趋势,目前StringBuffer、Vector、Hashtable在多线程里面不常使用,而是有了对应的替代类,如下
//在我们之前学的Collections这个工具类里面有3个方法,如下
//1、synchronizedList(List<T> list) 返回由指定列表支持的同步列表,即线程安全列表
//2、synchronizedMap(Map<K,V> m) 返回由指定映射支持的同步映射,即线程安全映射
//3、synchronizedSet(Set<T> s) 返回由指定集支持的同步集,即线程安全集
//代码演示如下:
List<String> list = Collections.synchronizedList(new ArrayList<String>());//本身new ArrayList<String>()是
//线程不安全的集合类,但是调用了synchronizedList方法之后,new ArrayList<String>()就变成了是线程安全的类
//思考:是怎么使不安全的集合类变成安全的集合类呢,选中上面那行的synchronizedList,Ctrl+B,查看源码,如下
//因为synchronizedList集合的方法内部使用同步代码块的方式添加了synchronized关键字,即synchronizedList是线程安全的集合类
//总结:通过调用了synchronizedList方法之后,new ArrayList<String>()就变成了是线程安全的集合类
//同理也可以得到Set和Map的线程安全集合类
}
}