前言
前一篇文章笔者就List接口及其实现类ArrayList的源码做了相关的分析,今天笔者将会对
Vector与ArrayList进行一个对比。理解什么是同步,什么是异步!以及Vector是如何实现同步的。
Vector类
阅读源码可以知道Vector类和ArrayList类存在很多共同的地方,但是Vector是实现了同步
的,至于其具体实现就不在给出了,读者可参考ArrayList的实现细节去理解而ArrayList是非同步的,
也就是异步的。这里同步和异步到底是个什么意思呢?
同步
同步指的就是协调同步的意思,线程同步这种说法是基于多线程的前提下的,针对共享资源
在某一个时间点只能允许一个线程占用资源,另一个线程等待。这种方式就是线程同步。需要将
同步于并发这两个概念区分开来。
了解了同步的概念之后我们就知道在什么时候我们应该使用线程同步了:多个线程共享一块
数据,对于此情况就必须使用同步,否则可能出现不安全的情况,例如数据库的脏读、幻读、
不可重复读。不过多线程下,对于原子操作是不需要使用同步技术的。
异步
首先需明白的是异步和多线程根本就是两个概念,异步是只有一个线程访问当前数据。
例如观察者模式,没有共享区,主题发生变化,通知观察者进行更新。主题自己做自己的,不需要
等待观察者完成更新之后再进行操作。
到此可以知道的是同步在多线程的情况下,同步是线程安全的,它通过对线程对共享资源的访问
权限进行控制,来实现多个线程的协调工作。反之异步是线程不安全的。
实例理解
package com.kiritor;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
public class Test implements Runnable {
private ArrayList<String> aa= new ArrayList<String>();
@Override
public void run() {
aa.set(0,"Thread");
}
public String get()
{
aa.add("ThreadMain");
System.out.println(aa.get(0).toString());
Iterator it = aa.iterator();
return aa.get(0).toString();
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
new Thread(test).start();
//dosomething
System.out.println(test.get());
}
}
需要说明的是有JVM实际调度情况上述代码既有可能出异常,这里我的输出是
ThreadMain
Thread,如果我在第一次读出ThreadMain对其记录到一个文件中,但是第二次读取出来
就变成了Thread,如果我在用ThreadMain去进行一些工作就是错误的了。
这就造成了不安全因素,因为我读取的数据和实际的数据时不一样的,这就和我在取钱
途中正好读出卡里有500元,而另一人刚好这时取走200元,此时的情况肯定是错误的。
正确的做法就是我的操作是“原子操作”,只有操作完成,另一个才能继续取钱。