在多线程中使⽤静态⽅法是否有线程安全问题
类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。
简单讨论⼀下在⼀个类中使⽤静态字段(static field)和静态⽅法(static method)是否会有线程安全问题。
我们在知道, 静态字段(static field)和静态⽅法(static method)的调⽤是通过类来调⽤。静态⽅法不对特定的实例操作,只能访问静态成员。实例⽅法可对特定的实例操作,既能访问静态成员,也能访问实例成员。
那么,在多线程中使⽤静态⽅法是否有线程安全问题?这要看静态⽅法是是引起线程安全问题要看在静态⽅法中是否使⽤了静态成员。
因为,在多线程中使⽤同⼀个静态⽅法时,每个线程使⽤各⾃的实例字段(instance field)的副本,⽽共享⼀个静态字段(static field)。所以说,如果该静态⽅法不去操作⼀个静态成员,只在⽅法内部使⽤实例字段(instance field),不会引起安全性问题。但是,如果该静态⽅法操作了⼀个静态字段,则需要静态⽅法中采⽤互斥访问的⽅式进⾏安全处理。
举个简单的例⼦,我们使⽤的Console.WriteLine();中WriteLine()是Console.WriteLine类的静态⽅法。
对于ASP.NET, 多个客户端访问服务器端, 这是⼀个多线程的例⼦.只要理解了原因,我们可以在三层架构中的数据访问层中放⼼使⽤静态⽅法(static method)来访问数据库.
先看⼀个类:
1 public class Test
2 {
3 public static String hello(String str)
4 {
5 String tmp = "";
6 tmp = tmp + str;
7 return tmp;
8 }
9 }
writeline方法属于类hello⽅法会不会有多线程安全问题呢?没有!
静态⽅法如果没有使⽤静态变量,则没有线程安全问题。
为什么呢?因为静态⽅法内声明的变量,每个线程调⽤时,都会新创建⼀份,⽽不会共⽤⼀个存储单元。⽐如这⾥的tmp,每个线程都会创建⾃⼰的⼀份,因此不会有线程安全问题。
注意:静态变量,由于是在类加载时占⽤⼀个存储区,每个线程都是共⽤这个存储区的,所以如果在静态⽅法⾥使⽤了静态变量,这就会有线程安全问题!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论