多线程中使用静态方法是否有线程安全问题
2014-04-11 09:25
295 查看
类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。
简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。
我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作,只能访问静态成员。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。
那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。
因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。
总结为一句话就是:
只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题,如果在静态方法中有访问多线程共享数据,就要小心多线程同步问题
简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。
我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作,只能访问静态成员。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。
那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。
因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。
总结为一句话就是:
只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题,如果在静态方法中有访问多线程共享数据,就要小心多线程同步问题
相关文章推荐
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题(转载)
- 多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- .NET Remoting 使用中的问题之静态方法
- 多线程中使用静态方法存在线程安全的问题
- 23 API-多线程(多线程概述,多线程实现方案,线程控制常见方法,线程安全问题及解决)
- 多线程访问文件问题中WaitForSingleObject方法的使用,及其效率!
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
- java语言基础(91)——多线程(同步方法解决线程安全问题)
- 静态 方法中使用Autowired注解的service或dao的问题
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- Struts2中使用OGNL表达式语言访问静态方法和静态属性以及我遇到的问题和解决方法
- 几个问题(八)-------使用静态工厂方法的好处和坏处
- C#静态变量和静态方法的线程安全问题