-->

多线程使用中单例变量和static变量的区别

2019-07-05 10:51发布

问题:

今天看到一个多线程问题解决了以后想再优化一下,用static代替单例获取变量:

class Test3 {
    private static Test3 t;
    public volatile int temp = 128;

    public static synchronized Test3 getInstance(){
        if(t == null){
            t = new Test3();
        }
        return t;
    }

}

改为:

class Test3 {
    public static int temp = 128;
}

然后发现线程执行temp累加,
10次结果是对的
100次后找不到228,只能找到227,temp结果大致是正确的的
随着循环次数的增加重复的数字就越多,
这是为什么,
static修饰的类变量不是只有一个内存地址么,那和使用单例获取有什么区别(使用单例获取变量一切正常)

回答1:

static修饰的类变量不是只有一个内存地址么,你没说错,但是你想一想 计算机是怎么做加法的。

  1. 先从地址拿到值放到寄存器
    2.寄存器里面加法算好
    3.在把变量的值修改(严格意义上不准确,但是基本可以这么理解)
    那么,假设temp=1, 然后2个线程同时执行1,2, 在先后执行3。那是不是本来temp应该是3的,结果确实2.

所以你测试的时候,会循环了100次,而temp累计的值可能不够100.

volatile 关键字就不解释了,直接baidu把。



回答2:

兄弟,你代码太乱了,都没心情看,这个编辑器是支持Markdown的,建议格式化一下代码。另外变量肯定是一个呀,要不就不需要考虑多线程安全了,如果每个线程都操作独自的变量,那还说个啥,所以和静态不静态没关系。