线程安全、非线程安全,同步、异步

来源:互联网 发布:画图软件有哪些 编辑:程序博客网 时间:2024/06/05 21:09

线程安全:简单来说,就是多线程同时操作同一个对象,不会有问题,但是线程安全必须使用synchronize来同步控制,所以势必会导致效率和性能的降低

非线程安全:多线程同时操作同一个对象可能会有问题,请注意,是可能,而不是一定

非线程安全 != 不安全

那么,又会牵扯到另一个概念,什么是同步,什么是异步?

同步: 如果数据是在线程中共享,在一个线程中操作的数据可能以后会被另外的线程用到或者已经被另外一个线程使用或者修改,那么这些数据就是共享的数据,必须同步,一个最经典的情景就是银行的存取款操作,同时对一个银行的账户进行存款,设想,如果初始金额都是500元,在同一个计算机时刻两个不同的线程中对该账户存款100元,那么程序读取的初始金额是不是可能都是500元,执行操作后,都显示的是600元?

异步: 当应用程序调用了对象的一个需要花费很长时间来执行的方法时,而又不希望让程序等待方法的返回,这时候就需要使用异步编程了。

synchronize的简单示例:

public synchronize void  (){}

1.String、StringBuffer、StringBuilder的区别

String:不可变长度的字符串,每次String str = “xxx”的时候,都会实例化一个新的字符串对象
StringBuffer:可变长度的字符串,线程安全的
StringBuilder:可变长度的字符串,非线程安全的
执行效率:StringBuilder > StringBuffer > String

2.ArrayList和Vector的区别

相同点:两个类都实现了List接口,而List接口又继承了Collection接口,他们都是有序集合,都允许有重复的元素,这是与HashSet之类的集合最大的不同之处,HashSet是无序的,且不允许有重复的元素
不同点:可变长度的字符串,线程安全的
同步性:Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果有一个线程访问到集合,最好用ArrayList,如果有多个线程访问到同一个集合,最好用Vector,当然,如果每个线程里都访问单独的集合,还是用ArrayList,效率会高一些
数据增长:两者都有一个初始的容量大小,当存储进它们的元素个数超过了容量的时候,就需要增加ArrayList和Vector的存储空间,Vector增长原来的一倍,ArrayList增长原来的0.5倍

3.HashMap和HashTable的区别

HashMap:线程不安全的,不是同步的
HashTable:线程安全的,方法之间是同步的