线程安全:是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
非线程安全:是多线程访问时,不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。所得数据可能不一致
区别:非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题
使用情况:如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList
线程安全是通过线程同步控制来实现的,也就是synchronized关键字;非线程安全通过异步实现
synchronized可以用在方法上也可以使用在代码块上,其中方法是实例方法和静态方法,被锁的对象是类的实例对象和类对象。而使用在代码块上分别是实例对象,class对象和任意实例对象Object,被锁的对象是类的实例对象,类对象和实例对象Object。注意:如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。
ArrayList是非线程安全的,Vector是线程安全的
HashMap是非线程安全的,采用异步处理,性能更高,在JDK1.2之后推出,使用的更多;
HashTable是线程安全的,采用同步处理,性能较低,在JDK1.0是推出
StringBuilder是非线程安全的,StringBuffer是线程安全的