`

ArrayList,Vector线程安全性测试

阅读更多
import java.util.ArrayList;
import java.util.List;

//实现Runnable接口的线程
public class HelloThread implements Runnable {
	String name;
	List<String> v;

	HelloThread(String name, List<String> v) {
		this.name = name;
		this.v = v;
	}

	public void run() {
		System.out.println(name + "start");
		while(true) {
			v.add(name + ".add");
			System.out.println(name + " list size is " + v.size());

			try {
				Thread.sleep(10);
			} catch(InterruptedException e) {
				System.out.println(e.getMessage());
			}
		}
	}

	public static void main(String args[]) throws InterruptedException {

		List<String> v = new ArrayList<String>();

		HelloThread hello1 = new HelloThread("hello1", v);
		HelloThread hello2 = new HelloThread("hello2", v);
		HelloThread hello3 = new HelloThread("hello3", v);

		Thread h1 = new Thread(hello1);
		Thread h2 = new Thread(hello2);
		Thread h3 = new Thread(hello3);
		h1.start();
		h2.start();
		h3.start();

	}
}

 结果:

hello3start
hello3 list size is 1
hello1start
hello1 list size is 2
hello2start
hello2 list size is 3
hello3 list size is 4
hello1 list size is 5
hello2 list size is 4
hello3 list size is 6
hello1 list size is 8
hello2 list size is 7
hello1 list size is 9
hello3 list size is 10
hello2 list size is 9

 

加了12次,但size却只有10,不安全

 

改成号称线程安全的Vector:

import java.util.Vector;

//实现Runnable接口的线程
public class HelloThread implements Runnable {
	String name;
	Vector<String> v;

	HelloThread(String name, Vector<String> v) {
		this.name = name;
		this.v = v;
	}

	public void run() {
		System.out.println(name + "start");
		while(true) {
			v.add(name + ".add");
			System.out.println(name + " vector size is " + v.size());

			try {
				Thread.sleep(10);
			} catch(InterruptedException e) {
				System.out.println(e.getMessage());
			}
		}
	}

	public static void main(String args[]) throws InterruptedException {

		Vector<String> v = new Vector<String>();

		HelloThread hello1 = new HelloThread("hello1", v);
		HelloThread hello2 = new HelloThread("hello2", v);
		HelloThread hello3 = new HelloThread("hello3", v);

		Thread h1 = new Thread(hello1);
		Thread h2 = new Thread(hello2);
		Thread h3 = new Thread(hello3);
		h1.start();
		h2.start();
		h3.start();
	}
}

结果:

hello1start
hello1 vector size is 1
hello2start
hello2 vector size is 2
hello3start
hello3 vector size is 3
hello1 vector size is 4
hello2 vector size is 5
hello3 vector size is 6
hello1 vector size is 7
hello2 vector size is 8
hello3 vector size is 9
hello1 vector size is 10
hello2 vector size is 11
hello3 vector size is 12
hello1 vector size is 13
hello3 vector size is 15
hello2
vector size is 15
hello1 vector size is 16

 

也出现了线程不安全现象吗?不是的

 

这个不算线程不安全,加了16次,size是16,恰恰是线程安全的表现,只不过是待两个线程都add完了之后才调的size(),所以都是15,跳过了14。

 

以上一样的程序多试几次就出现了,另外关于Vector的thread-safety

All Vector methods are synchronized themselves, so as long as you are only synchronizing around a single method, your own synchronization is not necessary. If you have several method calls, which depend on each other, e.g. something like vec.get(vec.size()-2) to get the second last element, you have to use your own synchronization since otherwise, the vector may change between vec.size() and vec.get().

 

所有的Vector的方法对它们自己而言都是 synchronized的,所以如果只要同步单个方法,自己额外添加的同步措施就失去必要了。如果有几个方法需要调用,且它们互相存在依赖,比如 vec.get(vec.size()-2),是要得到倒数第二个元素,那么就必须加上自己的同步措施,因为否则的话,vector有可能在 vec.size() 和 vec.get() 之间发生改变

 

 

 

 

 

 

分享到:
评论
1 楼 Tristan_S 2014-01-22  
3Q楼主的例子, 我运行的时候碰到另一个问题
ArrayList有时会出现越界异常
java.lang.ArrayIndexOutOfBoundsException:
Vector则不会
我想这可能是Vector和ArrayList的本质区别

相关推荐

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、...而Vector虽然提供了线程安全,但其性能通常低于ArrayList和LinkedList,更适合于多线程环境且对性能要求不那么敏感的应用。在实际开发中,选择哪种数据结构应根据具体需求来决定。

    使用Vector实现简单线程池

    尽管`Vector`在Java集合框架中已经被`ArrayList`和`LinkedList`等更高效的类取代,但它的线程安全性使其在多线程编程的示例中仍然有用。不过,实际生产环境中的线程池实现往往会选择更高效的数据结构,例如`...

    第17章 - 深入研究容器 - Collection(List,Set,Queue)的性能测试框架(单线程中)(P501)

    同时,了解这些类的并发性和线程安全性也是很重要的,尤其是在多线程环境中。 总之,设计并执行性能测试是评估和选择合适集合实现的关键步骤。通过深入研究源码和构建测试框架,我们可以根据具体需求选择最高效的...

    软件测试&oracle的笔试题,很重要

    1. 线程安全性:Vector是线程安全的,内部使用`synchronized`修饰方法,适合多线程环境;而ArrayList不是线程安全的,如果在多线程环境下使用,需要自行同步。 2. 性能:由于线程安全的实现,Vector的性能相对较低,...

    java多线程

    同时,Java容器类如Vector、Hashtable等是线程安全的,它们内部封装了同步机制,而像ArrayList、HashMap等则不是线程安全的,需要程序员自行处理同步问题。 Java中还可以使用Thread类提供的方法如start()、current...

    Java列表对象的性能分析和测试

    3. **线程安全性**: - 默认情况下,`LinkedList`不提供线程安全的实现。如果需要在多线程环境中使用,可以通过`Collections.synchronizedList`方法将其转换为线程安全的列表。 #### 四、结论 综上所述,在选择...

    Java集合知识测试B.doc

    ArrayList不是线程安全的,如果需要线程安全,应该考虑使用Vector或Collections.synchronizedList()进行同步包装(d正确,a和c错误)。 10. LinkedList是双链表实现的集合类,它的特点是增删元素速度快,但查询速度...

    Java集合知识测试B.pdf

    7. **Vector类**:Vector是JDK 1.0引入的,是一个线程安全的动态数组,但随着JDK的发展,ArrayList(非线程安全,但在单线程环境中性能更好)逐渐取代了Vector。然而,某些旧项目中仍然可能存在对Vector的使用。 8....

    2022年Java集合知识测试精编版.docx

    - Vector 主要在一些遗留系统或者对线程安全性有特殊需求的情况下仍然会被使用。 ### 六、ArrayList 和 LinkedList 的特性 1. **ArrayList**: - 底层采用数组实现。 - 查询速度快,因为可以通过索引直接访问...

    Java面试中,最常被人问到的几个问题

    Vector是线程安全的,但由于其同步机制,性能相对较低。 - **LinkedList**:它是双向链表结构,适合频繁进行插入和删除操作,但在随机访问上效率低于ArrayList和Vector。 - **Hashtable与HashMap**:两者都是Map...

    java中vector与hashtable操作实例分享

    不同之处在于,`Vector`的每个公共方法都被同步化,确保了在多线程环境下的安全性。这意味着当一个线程正在执行某个操作(如添加、删除或修改元素)时,其他线程会被阻塞,直到该操作完成。然而,这种全局的同步可能...

    JAVA容器效率深度分析List

    Vector与ArrayList类似,也是基于数组实现,但它线程安全。每个方法都加了synchronized关键字,确保多线程环境下操作的正确性。然而,这也会带来性能开销,所以在单线程环境中,ArrayList通常优于Vector。如果确实...

    ArrayList挑战

    7. **线程安全**:ArrayList不是线程安全的,如果在多线程环境下使用,需要进行同步控制,或者选择使用线程安全的`Vector`类。 8. **ArrayList与LinkedList的比较**:LinkedList是另一种List实现,它的插入和删除...

    java concurrent

    1. `ArrayList`与`Vector`:两者都是动态数组,但`Vector`是线程安全的,性能较低;`ArrayList`则在非并发环境下更快。 2. `LinkedList`:线程不安全,适用于频繁插入和删除的场景。 3. `ConcurrentHashMap`:并发...

Global site tag (gtag.js) - Google Analytics