java中是不是没做同步控制的对象都是线程不安全的???

突然想问,java中为什么Hashtable是线程安全的,而HashMap是线程不安全的?还有ArrayList为什么是线程不安全的,Vector是线程安全的??于是乎我就想是不是Hashtable、Vector内部实现中进行了同步控制。于是我就想,是不是没做同步控制的对象就不是线程不安全的??

2个回答

如果一个函数不访问成员函数,只访问局部变量和参数,那么它就不需要同步,也是线程安全的。(当然,这个函数内部不能调用线程不安全的其他函数)
这种函数是不变的(immutable),一个不变的函数,给定输入参数,返回值就给定了。比如说三角函数。
有的函数,它的返回值不但受到参数的影响,而且受到对象状态的影响,这种函数就需要同步。

String类是线程安全的,线程安全不安全是看有没有改变状态的变量。在开发中,service层一般都是线程安全的,因为所包含的变量Dao是安全的,
只有方法。若函数的变量是基本类型和string类型,则这个函数是安全的。函数中定义的对象,若没有返回出去也是线程安全的,因为它会放在方法
栈中。线程安全是一个难的知识点,建议看一下。关于ArrayList和HashMap不是线程安全的,可以百度一下看一下别人的解答。

lppzyt
lppzyt 回复wobushixiaobailian: 从大的角度说是这样的,还需要进行再细化,什么时候会共享。哪些情况不需要使用同步控制。同步代码块能否用原子操作的类去代替,等等。
一年多之前 回复
wobushixiaobailian
我不是小白脸 意思是线程安不安全,要先看是在共享内存部分,还是私有内存部分。发生线程不安全,只会发生在共享内存部分。而对象是存在共享内存区的,如果没做同步控制,它就可能被多个线程同时访问,于是就是线程不安全的咯?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问