java中线程安全和非线程安全_Java 线程安全/非线程安全

在Java中,

ArrayList是非线程安全的,Vector是线程安全的;

HashMap是非线程安全的,HashTable是线程安全的;

StringBuilder是非线程安全的,StringBuffer是线程安全的。

非线程安全是指多线程操作同一个对象时,可能会出现某些异常问题;而线程安全时多个线程操作同一个对象不会出现问题。

非线程安全执行效率更高,因为线程安全必须要使用很多 synchronized 关键字来同步控制,所以必然会导致性能的降低。

例如:

ArrayList和Vector,在主线程中new一个非线程安全的ArrayList,然后开10个线程分别向这个ArrayList中添加元素,每个线程添加100个元素,等所有线程执行完成后,这个ArrayList的大小一定是1000个元素吗?

多次测试结果如下:

945

1000

1000

998

959

可见,有些情况下,最终ArrayList大小并不是1000,有些是正确的1000个(因为非线程安全并不是每次都会导致问题),有时候还会抛出异常。

所以ArrayList是非线程安全的,但是当我们在主线程中new的是Vector对象,则后面的测试结果全部是正确的,即Vector是线程安全的,HashTable和StringBuffer同理。

另外,非线程安全 =!不安全,只要在多线程情况下,不操作同一个对象,使用非线程安全是不会出现问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值