类的成员有两类:一、静态成员(static member)二、实例成员(instance member)。
静态成员属于类,实例成员则属于对象(即类的实例)
大家都知道 静态的字段 [static field] 、方法 [static method] 是要通过 类 来调用。
静态方法不对特定的实例操作,只能访问静态成员。
实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。
那么,在多线程中使用静态方法是否存在线程安全问题 ?
答:这要看静态方法是引起线程安全问题,在静态方法中是否使用了静态成员 (静态成员类似于全局变量的概念,虽然java中并不存在所谓全局的概念)。
因为,在多线程中使用同一个静态方法时,每个线程 (在java中,不同的线程中存在着“隔离”,线程隔离技术) 都使用各自的实例字段[instance field]的副本,却都是共享一个静态字段[static field]。
所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段[instance field],不会引起安全性问题。
但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问(例如:加锁等)方式进行安全处理。
多线程调用静态方法,会复制一份代码,所以方法是安全。但静态变量在java 虚拟机中是唯一。
如果在方法中修改全局静态变量,就会线程不安全。