容器类的线程安全

1)Vector与ArrayList
    所谓线程安全,单线程和多线程运行这段代码结果是一样的(如果这段代码一般是一个函数,在其它语言中称为可重入函数),在JAVA中依靠同步来保障线程安全。阅读jdk原码我们可以知道Vector是线程安全的,而ArrayList是线程不安全的。如果一段程序在单线程中我们当然是使用那些线程不安全的函数,这样不需要加锁和解锁的操作,大大提高了程序运行的效率。
     一般我们程序运行在多线程的环境中,使用这些线程不安全的函数需要加锁来保证线程的安全性。如在ArrayList添加一个对象,要在多线程中保证每次操作安全,需要同步。
    synchronized(arraylist) {arraylist.add(new Object());},
    事实上,JDK提供了java.util.Collections的synchronizedXXX()等方法来传回一个同步化的容器对象,和上面代码等价
    List list = Collections.synchronizedList(new ArrayList());
   不过我们需要注意的是:即使是线程安全类,当在一个函数中加入对集合的某些条件判断,再使用这些这些线程安全函数, 那么操作的线程之间不一定是安全的。如下:

你可能感兴趣的:(jdk,多线程)