简介
Vector的内部实现类似于ArrayList,Vector也是基于一个容量能够动态增长的数组来实现的,该类是JDK1.0版本添加的
类,它的很多实现方法都加入了同步语句,因此是线程安全的
是JDK1.0版本添加的类,1.2版本Vector类改造实现List接口
和ArrayList不同,
Vector中的操作是线程安全的
。
Vector的构造函数
Vector共有4个构造函数
// 默认构造函数
Vector()
// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)
// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)
// 创建一个包含collection的Vector
Vector(Collection<? extends E> collection)
Vector的继承关系
Vector与ArrayList的比较
Vector的扩容机制
线程与进程
进程:是指个内存中运的应程序,每个进程都有个独的内存空间,个应程序可以同时运多个进程;进程也是程序的次执过程,是系统运程序的基本单位;系统运个程序即是 个进程从创建、运到消亡的过程。 线程:线程是进程中的个执单元,负责当前进程中程序的执,个进程中少有个线程。个进程中是可以有多个线程的,这个应程序也可以称之为多线程程序。

线程调度: 分时调度 所有线程轮流使 CPU 的使权,平均分配每个线程占 CPU 的时间。
抢占式调度 优先让优先级的线程使 CPU,如果线程的优先级相同,那么会随机选择个(线程随机性), Java使的为抢占式调度。
多线程
多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。
所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的。

并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上的,在同一时刻发生的,并行在时间上是重叠的。
java使用多线程的三种方式:
1.继承Thread类,并重写run方法。
class test extends Thread{
@Override
public void run() {
System.out.println("你好啊");
}
}
new test().start(); // 启动线程
2.实现Runnable接口,重写run方法
class God implements Runnable{
@Override
public void run() {
while (true){
System.out.println("上帝守护着你");
}
}
}
3.
实现Callable 接口,重写call方法
class dThread implements Callable<Boolean> {
private String url;
private String name;
public dThread(String url,String name)
{
this.url=url;
this.name= name;
}
@Override
public Boolean call() {
Download d = new Download();
System.out.println(Thread.currentThread().getName()+"开始下载");
d.imageDownload(url,name);
return Thread.currentThread().isAlive();
}
}
线程安全
当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。
如何确保线程安全?
synchronized
synchronized关键字,就是用来控制线程同步的,保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,使用方法一般是加在方法上。
Vector的线程安全体现:
Vector 类中的大部分方法都是由 synchronized 关键字来修饰的,这也就保证了所有的对外接口都会以 Vector 对象为锁。
访问 Vector 的任何方法都必须获得对象的 intrinsic lock (或叫 monitor lock ),所以在Vector内部,所有的方法都不会被多线程访问。

虽然源代码注释里面说这个是线程安全的,因为确实很多方法都加上了同步关键字 synchronized ,但是对于复合操作而言,只是同步方法并没有解决线程安全的问题。 要真正达成线程安全,还需要以 Vector 对象为锁,来进行同步处理 。
总结
vector的使用主要有如下两种场景:
(1)vector所谓的多线程安全,只是针对单纯地调用某个方法它是有同步机制的。如add,多个线程都在对同一个容器add元素,vector能够保证最后总数是正确的,而ArrayList没有同步机制,就无法保证。
(2)vector的多线程安全,在组合操作时不是线程安全的。比如一个线程先调用vector的size方法得到有10个元素,再调用get(9)方法获取最后一个元素,而另一个线程调用remove(9)方法正好删除了这个元素,那第一个线程就会抛越界异常。
总结:
(1)在需要对容器进行组合操作时,vector不适用(需要自己用synchronized将组合操作进行同步);
(2)仅在上述第一种场景时,才需要使用vector