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() 之间发生改变

 

 

 

 

 

 

weixin028基于微信小程序小说阅读器设计+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值