测试HashSet的线程不安全性

本文通过一个反面实例展示了在多线程环境下,未使用Collections.synchronizedSortedSet()进行同步的HashSet可能出现的问题。程序中,两个线程分别尝试取出并更新HashSet的第一个元素,导致线程不安全,输出结果出现不一致。作者指出,尽管使用同步包装可以解决此问题,但如何有效测试线程安全性仍是一个挑战。
摘要由CSDN通过智能技术生成

下面的程序有问题,根本没法测试线程安全性,我留在这里,以此作为反面教材,大家不要看了。下面的程序是取出后在进行赋值,集合的隔离级别防不住这个,所以是下面的程序有问题,不过我也没想到好办法来测试这个线程不安全。

没有使用Collections.synchronizedSortedSet()进行包装的HashSet的程序

import java.util.*;

public class CollectionTest2
{
	public static void main(String[] args)
	{
		//这里试一下,不使用Collections.synchronizedSortedSet()包装,
		//然后让两条线程分别取出LinkedHashSet中的第一个数字进行+1然后再放进去
		HashSet<Integer> set  = new HashSet<Integer>();
		set.add(0);
		
		System.out.println(set);
		
	
		//刚好复习一下,线程的三种写法
		
		//创建第一个线程
		AddNumThread ant = new AddNumThread(set);
		ant.start();
		//创建第二个线程
		AddNumThread ant2 = new AddNumThread(set);
		ant2.start();


	}
}
//使用第一种方法创建线程
//继承Thread类创建线程类
class AddNumThread extends Thread
{
	HashSet<Integer> set;
	public AddNumThread(HashSet<Integer> set)
	{
		this.set = set;
	}
	@Override 
	public void run()
	{
		for(int i = 0; i < 5; i++)//加5
		{
			int n = (int) set.toArray()[0];
			set.clear();
			set.add(n+1);
			System.out.println(set);
		}

	}
}

执行结果如下
在这里插入图片描述
从上面的结果可以看出,一个程序会出现两个结果,这就是线程不安全,
大错特错
把上面程序的HashSet用Collections.synchronizedSortedSet()抱起来后,执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流cpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值