什么是线程安全,静态变量实例变量局部变量线程安全吗为什么
来源:整理 编辑:智能门户 2023-08-23 21:45:04
本文目录一览
1,静态变量实例变量局部变量线程安全吗为什么
1、静态变量:线程非安全。静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。2、实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。3、局部变量:线程安全。每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。搜一下:静态变量,实例变量,局部变量线程安全吗,为什么
2,struts2的action是不是线程安全的为什么struts1的action了
Struts1的action不是线程安全的,原因是,不同用户的相同请求,都用同一个action实例处理,就导致了线程的不安全。Struts2的机制是,对每一个请求分配一个新的action实例进行处理,因此不存在线程不安全的问题,是线程安全的。struts2的机制是,对每一个请求分配一个新的action实例进行处理,因此不存在线程不安全的问题,是线程安全的。《strut2权威指南》中有这么一段: Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心,Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题 。
3,线程安全 问题 如何判断一个类是否是线程安全的
线程安全性类要成为线程安全的,首先必须在单线程环境中有正确的行为。如果一个类实现正确(这是说它符合规格说明的另一种方式),那么没有一种对这个类的对象的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的情况。此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。正确性与线程安全性之间的关系非常类似于在描述 ACID(原子性、一致性、独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度看,由不同线程所执行的对象操作是先后(虽然顺序不定)而不是并行执行的。servlet是单列的,如果有实例变量的,对它修改就会产生线程安全问题! 打比方多个线程同时对这个变量修改结果就不正确了。sessionfactroy的话一般用threadlocal实现的,一个线程一个sessionfactory,所以线程安全的。session如果当成实列变量的话就是非线程安全了。反正一句话单列 共享,对其修改就是要考虑线程安全,一半会加锁。至于线程安全的话就是看自己是怎么实现的
4,ArrayListLinkedListSet的区别是什么
ArrayList 实现List接口 ,随着向 ArrayList 中不断添加元素,其容量也自动增长 对于处理一列数据项,Java提供了两个类ArrayList和LinkedList, ArrayList的内部实现是基于内部数组Object[], 所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。 在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了 Set一个不包含重复元素的容器linkedlist类linkedlist实现了list接口,允许null元素。此外linkedlist提供额外的get,remove,insert方法在linkedlist的首部或尾部。linkedlist不是同步的(不是线程安全)。实现线程安全:list list =collections.synchronizedlist(new linkedlist(...));增删快,查询慢。arraylist类 arraylist实现了可变大小的数组。它允许null。arraylist没有同步。增删慢,查询快。vector类 vector线程安全。 效率低
5,ArrayList类HashMap类Vector类的区别和它们都什么时候用
1、在数据结构上不同。LinkedList为链表,ArrayList为数组列表,Vector为向量,HashMap为通过Hash值索引的图。在具体实现上有不同。2、从数据接口上看,LinkedList,ArrayList,Vector都实现了List接口,所以功能上基本相同,都可通过index数值定位数据。HashMap实现的是Map接口,通过指定的键的Hash值来定位数据,数据较多时,速度比较快。LinkedList类实现了List接口,用LinkedList类实现的List集合采用链表结构保存对象。ArrayList类使用大小会根据需要动态增加的数组来实现 IList 接口。HashMap类实现了Map接口,由HashMap类实现的Map集合,允许以null作为键对象,但是因为键对象不可以重复,所以这样的键对象只能有一个。Vector 类 提 供 了 实 现 可 增 长 数 组 的 功 能, 随 着 更 多 元 素 加 入 其 中, 数 组 变 的 更 大。 在 删 除 一 些 元 素 之 后, 数 组 变 小。arraylist类、vector类、linkedlist类 都是可伸缩的数组,就是可以动态改变长度的数组。 arraylist类是jdk1.1后出现的,在内存中是队列形式存储,适合查找。他不是线程安全的。 vector类是较老的数组列表,他是线程安全的。 linkedlist类是链表结构的数组,它适合增删改的操作,但与arraylist相比,查询效率较低。 实际应用中:arraylist是最常用的。 hashmap类,与之对应的有一个hashtable类,这两个类的区别: hashmap是新的类,他不是线程安全的。 hashtable是旧的类,他是线程安全的。 他们的共同点是:存储一个键值对形式的数据。并根据键来增删改查。键不能重复! 以上是我自己总结的。希望能帮到你的忙。
6,Java中HashMap和Hashtable分别是干什么用的就是说他们有什么用
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。2 HashTable是线程安全的一个Collection。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。都是利用了hash映射技术1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。2 HashTable是线程安全的一个Collection。HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。http://blog.csdn.net/lxyhjh051/article/details/5023490 里边有详细介绍1.HashMap和HashTable都是放入key->value的映射,但是HashTable是线程安全的就是不可能同时有两个以上的线程向HashTable放值,相对来说HashMap就不是线程安全的.2.HashTable不允许Key和value为null而HashMap是允许的.1.hashtable是dictionary的子类,hashmap是map接口的一个实现类; 2.hashtable中的方法是同步的,而hashmap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用hashtable了;而对于hashmap,则需要额外的同步机制。但hashmap的同步问题可通过collections的一个静态方法得到解决: map collections.synchronizedmap(map m) 这个方法返回一个同步的map,这个map封装了底层的hashmap的所有方法,使得底层的hashmap即使是在多线程的环境中也是安全的。 3.在hashmap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示hashmap中没有该键,也可以表示该键所对应的值为null。因此,在hashmap中不能由get()方法来判断hashmap中是否存在某个键,而应该用containskey()方法来判断。
文章TAG:
什么 线程安全 程安全 安全 什么是线程安全