精华内容
下载资源
问答
  • 实例变量:单例模式(只有一个对象实例存在)线程不安全,非单例线程安全。 实例变量为不加static的变量,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个...

    静态变量:线程不安全。

    静态变量即类变量,前面加static,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。

    实例变量:单例模式(只有一个对象实例存在)线程不安全,非单例线程安全。

    实例变量为不加static的变量,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

    局部变量:线程安全。

    每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

    转载于:https://www.cnblogs.com/liuqing576598117/p/10600370.html

    展开全文
  • 局部变量不存在线程安全问题。 静态变量在该类的所有实例之间共享,如果会进行修改的话会有线程安全问题。 全局变量在单例时会有线程安全问题,多例时不存在。...

    局部变量不存在线程安全问题。

    静态变量在该类的所有实例之间共享,如果会进行修改的话会有线程安全问题。

    全局变量在单例时会有线程安全问题,多例时不存在。

    展开全文
  • 局部静态变量的多线程问题

    千次阅读 2014-06-26 20:46:23
    局部静态变量的多线程问题


    静态局部变量实在第一次访问的时候进行初始化的,先来看下初始化的过程

    class base
    {
    public:
    	base(){}
    };
    
    void fn()
    {
    	static base t;
    }
    

    首先定义一个类; 初始化过程的汇编



    首先取出一个值和1进行比较 ,如果不等把1 复制给这个地址 然后调用base的构造函数进行初始化

    根据上下文 可以理解 其实这个地址就是来标记该静态变量是否进行过初始化,如果没有置为1,然户进行初始化。如果为1,则跳过初始化。


    下面考虑多线程的环境当线程1 在赋值标志位之前判断标志位之后,切换到线程2,线程2也会判断为未初始化,则 这种情况下base会初始化两次,考虑一种情况,如果构造函数里有申请内存的操作则析构时只会析构后者。会造成内存泄露~ 所以多线程的局部静态变量的初始化也是不安全的~ 



    展开全文
  • 实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。 实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程...

    静态变量:线程非安全。
    静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。
    实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。
    实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。如果是两个线程,但是对象却是一个,线程则不安全了。
    局部变量:线程安全。
    每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

    静态变量线程安全问题模拟

    /**  
      * 线程安全问题模拟执行  
      *  ------------------------------  
      *       线程1      |    线程2  
      *  ------------------------------  
      *   static_i = 4;  | 等待  
      *   static_i = 10; | 等待  
      *    等待          | static_i = 4;  
      *   static_i * 2;  | 等待  
      *  ----------------------------- 
     * */  
    public class Test implements Runnable  
    {  
        private static int static_i;//静态变量   
    
        public void run()  
        {  
            static_i = 4;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取static_i 的值:" + static_i);  
            static_i = 10;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取static_i*2的值:" + static_i * 2);  
        }  
    
        public static void main(String[] args)  
        {  
            Test t = new Test();  
            //启动尽量多的线程才能很容易的模拟问题   
            for (int i = 0; i < 3000; i++)  
            {  
                //t可以换成new Test(),保证每个线程都在不同的对象中执行,结果一样   
                new Thread(t, "线程" + i).start();  
            }  
        }  
    }  

    根据代码注释中模拟的情况,当线程1执行了static_i = 4; static_i = 10; 后,线程2获得执行权,static_i = 4; 然后当线程1获得执行权执行static_i * 2; 必然输出结果4*2=8,按照这个模拟,我们可能会在控制台看到输出为8的结果。

    [线程27]获取static_i 的值:4 
    [线程22]获取static_i*2的值:20 
    [线程28]获取static_i 的值:4 
    [线程23]获取static_i*2的值:8 
    [线程29]获取static_i 的值:4 
    [线程30]获取static_i 的值:4 
    [线程31]获取static_i 的值:4 
    [线程24]获取static_i*2的值:20

    实例变量线程安全问题模拟:

    public class Test implements Runnable  
    {  
        private int instance_i;//实例变量  
    
        public void run()  
        {  
            instance_i = 4;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取instance_i 的值:" + instance_i);  
            instance_i = 10;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取instance_i*2的值:" + instance_i * 2);  
        }  
    
        public static void main(String[] args)  
        {  
            Test t = new Test();  
            //启动尽量多的线程才能很容易的模拟问题   
            for (int i = 0; i < 3000; i++)  
            {  
                //每个线程对在对象t中运行,模拟单例情况  
                new Thread(t, "线程" + i).start();  
            }  
        }  
    }  
    [线程66]获取instance_i 的值:10 
    [线程33]获取instance_i*2的值:20 
    [线程67]获取instance_i 的值:4 
    [线程34]获取instance_i*2的值:8 
    [线程35]获取instance_i*2的值:20 
    [线程68]获取instance_i 的值:4

    将new Thread(t, “线程” + i).start();改成new Thread(new Test(), “线程” + i).start();模拟非单例情况,会发现不存在线程安全问题。
    局部变量线程安全问题模拟:

    public class Test implements Runnable  
    {  
        public void run()  
        {  
            int local_i = 4;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取local_i 的值:" + local_i);  
            local_i = 10;  
            System.out.println("[" + Thread.currentThread().getName()  
                    + "]获取local_i*2的值:" + local_i * 2);  
        }  
    
        public static void main(String[] args)  
        {  
            Test t = new Test();  
            //启动尽量多的线程才能很容易的模拟问题  
            for (int i = 0; i < 3000; i++)  
            {  
                //每个线程对在对象t中运行,模拟单例情况   
                new Thread(t, "线程" + i).start();  
            }  
        }  
    }  

    控制台没有出现异常数据。因为,每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,所以没有安全问题。

    后记
    静态方法如果没有使用静态变量,则没有线程安全问题。

    public class  Test{
        public static  String hello(String str){
            String tmp="";
            tmp  =  tmp+str;
           return tmp;
        }
    }

    这里的tmp,每个线程都会创建自己的一份,因此不会有线程安全问题。静态变量,由于是在类加载时占用一个存储区,每个线程都是共用这个存储区的,所以如果在静态方法里使用了静态变量,这就会有线程安全问题!
    总结:只要方法内含有静态变量,就是非线程安全的

    展开全文
  • Java多线程编程中,存在很多线程安全问题,至于什么是...此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量
  • 参考文章
  • 多线程中 静态变量,普通变量(实例变量),局部变量,静态方法,普通方法 的线程安全问题 类型 是否安全 存储位置 解释 静态变量 线程不安全 方法区 静态变量为类所持有,为所有对象共享,全局只有一份,...
  • 局部变量线程安全问题

    千次阅读 2018-01-10 15:49:22
    局部变量线程安全问题 只看楼主 收藏 回复 mincike 沝 2 求大神给解释下 回复 1楼 2016-02-...
  • 局部静态变量方法: // 局部静态变量 class Singleton{ public: // 使用指针而不是引用是为了避免拷贝构造函数进行拷贝 // Singleton single = Singleton::getInstance(); static Singleton* getInstance(){ static...
  • 1. 静态变量线程安全 静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程安全。 public class Test1 implements Runnable { private static int ...
  • C++11 静态 局部变量 初始化 线程安全
  • java线程安全问题之静态变量、实例变量、局部变量

    万次阅读 多人点赞 2012-12-14 15:08:06
    java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一... 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则
  •   java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说: ... 此处不赘述了,首先给出静态变量、实例变量、局部变量在多
  • final 静态变量线程安全

    千次阅读 2019-01-08 16:30:44
    我的代码中已经多次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很多地方最容易提的问题就是这个东西线程不安全   于是我不免产生了以下几个... 什么是快速把一段代码变成线程安全的...
  • 1、全局变量比局部静态变量后析构。 2、C++全局静态变量的析构销毁顺序是未定义的,特别是在多线程环境,多dll环境下,特别复杂,但是在某个编译器下,析构顺序是一定,按着构造的反顺序析构,其他都是随机,不...
  • 1.线程安全问题都是由全局变量及静态变量引起的。但是,如果每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;如果有多个线程同时执行写操作,一般都需要考虑线程同步,...
  • Java线程安全问题之静态成员变量、实例成员变量局部变量 (原文地址:http://blog.csdn.net/will_awoke/article/details/38044415) java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢...
  • C++当中常常需要一个全局唯一的对象... 既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很
  • 浅析VB.NET局部静态变量

    千次阅读 2014-08-19 08:57:31
    经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。VB.NET能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态...
  •  今天在论坛上看到有朋友发帖问道:既然静态全局变量与全局变量都存储在全局数据区,为什么作用域却不一样呢?也许答案非常简单:C++就是这么规定的,静态全局变量与全局变量的唯一区别就是作用域不同。  对一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,627
精华内容 53,850
关键字:

局部静态变量线程安全