搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 实例变量和线程安全

实例变量和线程安全

2018-05-14
举报

前言

自定义线程类中的实例变量针对其他线程可以有共享与不共享之分。这在多个线程之间进行交互是很重要的一个技术

实例看数据不共享情况

MyThread.java

Run.java

实例变量和线程安全

结果:

实例变量和线程安全

由结果可以看出来,一共创建了3个线程,每个线程都有各自的count数值,自己减少自己的count变量的数值,这样的情况就是变量不共享。如果想实现3个线程共同对一个count变量进行减法操作的目的,该如何设计代码呢?

实例演示数据共享情况

MyThread.java

实例变量和线程安全

Run.java

实例变量和线程安全

结果:

实例变量和线程安全

线程A和线程B打印出的Count值都是3,说明A和B同时对Count进行处理,产生了“非线程安全”问题。而我们想要得到的打印结果确不是重复的,而应该是依次递减的。(非线程安全:是指多个线程对同一对象中的同一个实例变量进行操作会出现值被更改,值不同步的情况,进而影响程序的执行流程)

   在某些JVM中,i--的操作要分成3步

1,取得原有i的数值

2,计算i-1

3,对i进行赋值

在这3个步骤中,如果原有多个线程同时访问,那么一定会出现非线程安全问题

代码更改:

实例变量和线程安全

结果:

通过在run()方法前加入关键字synchronized关键字,使得多个线程在执行run方法的时候,以排队的方式进行处理。当一个线程调用run前,先判断run方法有没有被上锁,如果上锁,说明其他线程正在调用run()方法,必须等其他线程对run()方法调用结束后可可以执行run()方法。

synchronized可以在任意对象及方法上面加锁,而加锁的这段代码称为“互斥区”或“临界区”

今日跑步记录



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《实例变量和线程安全》的版权归原作者「小胡的技术之路」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报