• 再次理解多线程线程安全问题(理解java内存模型后)


    1.多线程访问的共享资源存在线程安全问题,

    无外乎访问两种共享资源。

    1)多线程访问方法区数据。存在线程安全问题,通过加锁

    2)多线程访问实例变量:被访问对象是单例时存在线程安全,被访问对象是多例时,是线程安全的。

    来说说静态变量、实例变量、局部变量在多线程下的安全问题吧!

    (一)验证静态变量的线程安全性:

        (1)从程序执行的图中我们可以看出,执行结果中有错误数据,证明了静态变量是存在资源冲突问题的。

        (2)程序运行结果图: 

        wKioL1XIYiCz51UGABceSj2NUtI169.bmp

        5、结论:静态变量也称为类变量,属于类对象所有,位于方法区,为所有对象共享,共享一份内存,一旦值被修改,则其他对象均对修改可见,故线程非安全。

    (二)实例变量:单例时线程非安全,非单例时线程安全

        1、实例变量:实例变量属于类对象的,也就是说,属于对象实例私有,在虚拟机的堆中分配。

        2、验证实例变量的线程安全性:

        (1)从程序截图中,我们可以看到,当为单例模式时,会产生资源冲突,当非单例模式时,则不会产生线程冲突。

        (2)程序运行结果图:

        图1:

        wKioL1XIYl_RoatmABZU8hrY9Ck087.bmp

        图2:

        wKioL1XIYpzTOhE2ABZK5iG2N3I856.bmp

     3、结论:实例变量是实例对象私有的,系统只存在一个实例对象,则在多线程环境下,如果值改变后,则其它对象均可见,故线程非安全;如果每个线程都在不同的实例对象中执行,

    则对象与对象间的修改互不影响,故线程安全。

    (三)局部变量:线程安全

         1、局部变量:定义在方法内部的变量。

         2、验证局部变量的安全性:

        (1)从程序截图中可以看出,局部变量在多线程下没有产生资源冲突的问题

        (2)程序运行结果图:

        wKiom1XIYLvxqpwpABZORsRL6uY028.bmp

        3、结论:每个线程执行时都会把局部变量放在各自的帧栈的内存空间中,线程间不共享,故不存在线程安全问题。

     本文参考http://longw.blog.51cto.com/6475045/1683360,感谢原作者

  • 相关阅读:
    c/c++字符串传递
    从一个小程序明白new和delete的奇特现象
    Linux下构造函数string需要注意的问题
    字符串转time_t
    CentOS7基础建站指南(笔记)
    图与搜索
    面向的对象编程的小猫腻
    多线程编程
    生产者消费者模式-Java实现
    Java-代理模式的理解
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5897023.html
Copyright © 2020-2023  润新知