类的成员分为两类,静态成员(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 }
hello方法会不会有多线程安全问题呢?没有!spa
静态方法若是没有使用静态变量,则没有线程安全问题。
为何呢?由于静态方法内声明的变量,每一个线程调用时,都会新建立一份,而不会共用一个存储单元。好比这里的tmp,每一个线程都会建立本身的一份,所以不会有线程安全问题。
注意:静态变量,因为是在类加载时占用一个存储区,每一个线程都是共用这个存储区的,因此若是在静态方法里使用了静态变量,这就会有线程安全问题!线程