精华内容
下载资源
问答
  • 多线程调用静态方法

    千次阅读 2015-10-19 16:20:55
    一、文章来由项目需求,可能要在多线程使用静态方法。二、静态方法与线程安全类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。 我们...

    一、文章来由

    项目需求,可能要在多线程中使用静态方法。

    二、静态方法与线程安全

    类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。

    我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作,只能访问静态成员。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。

    那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。

    因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。

    举个简单的例子,我们使用的Console.WriteLine();中WriteLine()是Console.WriteLine类的静态方法。

    对于ASP.NET, 多个客户端访问服务器端, 这是一个多线程的例子.只要理解了原因,我们可以在三层架构中的数据访问层中放心使用静态方法(static method)来访问数据库。

    展开全文
  • 区别 静态方法会随着类的加载装入内存中,并且只为类创建了一...因为静态方法随着类的加载时候就已经构建,时间要早于非静态方法,故静态方法只能调用静态方法静态变量(因为编译静态方法的时候非静态方法和非静态...

    区别
    静态方法会随着类的加载装入内存中,并且只为类创建了一个静态副本,只分配一个内存空间,虽然该类可能有多个对象,但是静态成员只有一份,为多个类共享。
    非静态方法属于对象的具体实例,只有在类的对象创建时(new 对象时…)在对象的内存中才有这个方法的代码段。
    因为静态方法随着类的加载时候就已经构建,时间要早于非静态方法,故静态方法只能调用静态方法和静态变量(因为编译静态方法的时候非静态方法和非静态变量还没有编译),而非静态方法却可以调用静态方法和成员。
    静态方法使用
    类名.方法名或者对象名.方法名
    非静态方法使用
    对象名.方法名

    多线程调用静态方法是否线程安全?
    多线程中使用同一个静态方法时,每个线程使用方法内局部变量的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用局部变量,不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。
    即多线程调用静态方法,会复制一份代码,所以方法是安全。但静态变量在java 虚拟机中是唯一。如果在方法中修改全局静态变量,就会线程不安全。

    https://blog.csdn.net/xiamin/article/details/102696179
    https://blog.csdn.net/Lzz0614/article/details/86513575

    展开全文
  • 1、现象描述 最近使用了一个新的上传文件的工具类,返回的图片和实际的人像不符合,怀疑出现了线程安全问题。 2、故障分析 通过日志观察发现,工具类返回的...由于在多线程环境下静态方法访问了静态变量,但是...

    1、现象描述

    最近使用了一个新的上传文件的工具类,返回的图片和实际的人像不符合,怀疑出现了线程安全问题。

    2、故障分析

    通过日志观察发现,工具类返回的数据和实际人像不一致,怀疑工具类在多线程下的使用存在问题,决定分析工具类。

    3、最终结果

    最后发现,工具类中的上传文件方法都是静态方法,也引用了全局的静态变量,初始化是通过静态代码块实现的。

    由于在多线程环境下静态方法访问了静态变量,但是没有加锁导致产生了数据安全问题。

    4、解决方案

    给每一个静态方法都增加一个同步锁synchronized。

    展开全文
  • C# 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的       using System;using System.Threading;using System.Threading.Tasks;using System.Diagnostics;using System....

     C#  多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的

     

     

     

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Reflection;

    namespace MulThreadTest
    {
    class MainClass
    {

     

    public static void Main (string[] args)
    {

    for (int i = 0; i < 2; i++) {
    var th=new Thread(
    new ParameterizedThreadStart((state)=>{
    DoHelper.Instance.SayHello(state.ToString());
    })
    );
    th.Start (i);
    }

    Console.ReadKey ();

    }

     


    }

     

    public class DoHelper{

    public static DoHelper Instance=new DoHelper();

    public string SayHello(string id){

    string res = "调用Id:" + id;
    StackTrace trace = new StackTrace(true);
    StackFrame frame = trace.GetFrame(1);//1代表上级,2代表上上级,以此类推
    MethodBase method = frame.GetMethod(); //获得当前方法名称


    Console.WriteLine (res);
    Console.WriteLine ("当前方法的Hash code: "+method.GetHashCode());
    /*if (id=="1") {
    System.Threading.Thread.Sleep (5000);
    }
    */
    System.Threading.Thread.Sleep (1000);


    Console.WriteLine ("当前线程上下文Id:"+Thread.CurrentContext.ContextID);
    Console.WriteLine ("当前线程Id:"+Thread.CurrentThread.ManagedThreadId);
    Console.WriteLine ("当前时间:"+DateTime.Now.ToString());
    Console.WriteLine ("当前Trace hashcode :"+trace.GetHashCode());//Variables declared inside methods (with the possible exception of "captured" variables) are isolated,


    return res;
    }

    }
    }

    展开全文
  • 多线程静态方法使用安全

    千次阅读 2016-05-06 20:12:01
    在java多线程下,有很多操作是不安全的,比如对数据的存取,但是静态方法一般是不会出现问题,而我出现啦一个平时不常见的问题。
  • 大家都知道 静态的字段 [static field]、方法 [static method] 是要通过类来调用静态方法不对特定的实例操作,只能访问静态成员。 实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。 ...
  •  我们知道,静态字段和静态方法调用都是通过类来调用的,静态方法不会对特定的实例操作,只能调用调用类中的其他属性和静态方法,不能调用类中的非静态属性和非静态方法。实例方法可以对特定的实例操作,既能访问...
  • 多线程调用同一静态方法会有多线程问题吗项目中有类的public static方法有可能被多线程同时调用,所以有这个疑问,大致网上查了下自己没有试验过。 只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同...
  • 多线程使用静态方法是否有线程安全问题 类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。 简单讨论一下在一个类中使用静态字段...
  • 类的成员分为两类,静态成员(static... 简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。   我们在知道, 静态字段(static field)和静态方法(static method)的
  • 多线程使用静态方法

    千次阅读 2019-03-08 17:48:47
    类的成员分为两类,静态成员... 简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。 我们在知道, 静态字段(static field)和静态方法(static method)的调用是通...
  • paip.多线程调用静态方法错乱的解决

    千次阅读 2013-04-14 23:05:07
    多线程调用静态方法错乱的解决 作者Attilax , EMAIL:1466519819@qq.com C#.NET  理论上,调用静态方法,其内部的局部变量是互相间没关系的。。 当操作一些文件,数据库时,才需要LOCK.. ...
  • 多线程使用静态方法是否有线程安全问题 类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。简单讨论一下在一个类中使用静态字段...
  • 线程调用静态方法,是否会出现并发问题取决于,静态方法内部是否需要引用共享区内的静态变量。当线程调用静态方法时,都会创建一套临时变量,可见性是在这个线程内部,所以当线程调用静态方法时,并且这个...
  • 使用两个线程调用同一静态方法(该静态方法不引用静态变量)、第一个线程被阻塞的时间大于第二个线程被阻塞的时间,若第一个线程与第二个线程的输出结果相同,则两个线程调用同一静态方法存在线程安全问题,若第一个...
  • 多线程访问静态方法中的静态变量

    千次阅读 2017-09-04 00:39:59
    背景:近期,项目中遇到一个场景,多线程访问一个数组,从下标0开始一直到最大长度,然后再从下标0开始,如此循环往复(线程0访问数组下标0,线程1访问数组下标1......)。下标的数值由一个静态变量共享。当时是这么...
  • 1,java在执行静态方法时,会在内存中拷贝一份,如果静态方法所在的类里面没有静态的变量,那么线程访问就是安全的,比如在javaee中服务器必然会多线程的处理请求此时如果设计全局需要调用静态方法,可用此种设计...
  • 再次表示对网上知识贡献力量的感谢,是你们的无私奉献提高了...类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。  简单讨论一下在一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504,502
精华内容 201,800
关键字:

多线程调用静态方法安全吗