线程安全与线程不安全如何来理解呢?

2020-05-24 19:50:23 java常见问答 9129

不知道大家对线程是有所了解的吧,在提及某些功能特点的时候,都会提及到时候线程安全的问题,所以不知道大家是否真正的知道线程安全不安全是如何进行理解的呢?接下来小编给大家来介绍,一起来进行了解下吧。

通过代码来进行解说,先写一个线程不安全的类如下:

public class Count
{
    private int num;
    public void count()
    {
        for (int i = 1; i <= 10; i++)
        {
            num += i;
        }
        System.out.println(Thread.currentThread()
            .getName() + "-" + num);
    }
}

我们按照正常的理解,就是调用count()的方法结果应该会输出55这个值

然后写测试类,在主函数中启动10个线程,代码如下:

public class ThreadTest
{
    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            Count count = new Count();
            public void run()
            {
                count.count();
            }
        };
        for (int i = 0; i < 10; i++)
        {
            new Thread(runnable)
                .start();
        }
    }
}

根据以上的代码的运行结构,可以知道结果,如下显示:

Thread - 0 - 55
Thread - 1 - 110
Thread - 2 - 165
Thread - 4 - 220
Thread - 5 - 275
Thread - 6 - 330
Thread - 3 - 385
Thread - 7 - 440
Thread - 8 - 495
Thread - 9 - 550

然后从上述我们得知的答案,只有Thread-0线程输出的结果是我们期望的,其他的结果跟想象中的结构是不符合的,这是什么原因所导致的呢?

每个线程都有自己的工作内存(线程栈),工作内存存储了主内存count对象的一个副本,当线程操作count对象时,首先从主内存复制count对象到工作内存中,然后执行代码count.count()方法。

以上就是今天所讲的线程的知识,想要了解更多关于Java常见问答的知识,请继续关注本网站。

推荐文章:

java并发编程面试题合集-守护线程和本地线程区别 

线程池面试题一般会怎么问?线程池面试题总结及答案整理

线程池的核心参数有哪些?分别代表什么?