对java变量线程安全的理解
1、变量的分类:类变量,实例变量,局部变量(方法里面的变量)2、假设,一个主线程类,一个子线程类。主线程中开启多个子线程。子线程没有再开启子线程。3、分析每一种变量(以下的分析基于2中的假设)(1):首先,对变量的读操作不会出现问题,写操作可能会出现问题。
2、(2):类变量(主类), 可能会出现线程安全问题(如果子类的run方法对类变量(主类)进行写操作,会发生线程安全问题;否则不会)。看下面的例子,在主线程中定义一个类变量,然后在子线程中对其值加1。如果没有线程安装问题结果应该是3000,结果是2997,说明有3个线程读了脏数据。
3、(3):类变量(子亿姣灵秀类), 可能会出现线程安全问题(如果子类的run方法对类变量(子类)进行写操作,会发生线程安全问题,否则不会,这和(2)中的情况其实是一个意思)。看下面的例子,在子线弛贾班隧程中定义一个类变量,然后在子线程中对其值加1。如果没有线程安装问题结果应该是6000,结果是5999,说明有1个线程读了脏数据。
4、(4):实例变量(主类),可能会出现线程安全问题,如果主类的实例变量,在开启子线程时,将此变量传递给了子线程,并且子线程有写操作,就会出现线程安全问题。(5):实例变量(子类),不会出现线程安全。因为此变量只属于某个线程,其他线程不会访问到(每个线程都会创建自己的一份,不会共享)。实例变量是一个类的非静态属性:
5、(6):局部变量(主类),可能会出现线程安全问题,同(4)。(7):局部变量(子类),不会出现线程安全,同(5)。局部变量是方法的变量:
6、测试(6)。在主线程中定义一个局部变量,然后将其传入子线程,并在子线程中对其值加1。如果没有线程安装问题结果应该是8000,结果是7998,说明有2个线程读了脏数据。
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:47
阅读量:63
阅读量:25
阅读量:50
阅读量:55