首页 理论教育 Java多线程访问实例变量-Java语言程序设计

Java多线程访问实例变量-Java语言程序设计

时间:2023-10-18 理论教育 版权反馈
【摘要】:图8-4 线程之间不共享数据实例图图8-5 线程间共享数据示例图 在不共享数据时,每个线程都拥有自己作用域的变量,且多个线程之间相同变量名的值也不相同。这样的情况就是变量不共享,此实例并不存在多个线程访问同一个实例变量的情况。 如果想实现多个线程共同对一个变量进行操作的目的,该如何设计代码呢?共享数据的情况就是多个线程可以访问同一个变量,如在实现投票功能的软件时,多个线程可以同时处理同一个人的票数。

Java多线程访问实例变量-Java语言程序设计

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

图8-4所示为共享数据的示例,图8-5所示为不共享数据的示例。

图8-4 线程之间不共享数据实例图

图8-5 线程间共享数据示例图

【例8-5】 在不共享数据时,每个线程都拥有自己作用域的变量,且多个线程之间相同变量名的值也不相同。下面创建一个示例演示这种特性。

(1)首先创建自定义的线程类My Thread,代码如下:

(2)下面编写代码,在主线程中创建3个My Thread线程,并启动这些线程。具体代码如下:

从如下所示的运行结果可以看出,程序一共创建了3个线程,每个线程都有各自的count变量,自己减少自己的count变量的值。这样的情况就是变量不共享,此实例并不存在多个线程访问同一个实例变量的情况。

(www.xing528.com)

【例8-6】 如果想实现多个线程共同对一个变量进行操作的目的,该如何设计代码呢?这时就必须使用共享数据的方案。共享数据的情况就是多个线程可以访问同一个变量,如在实现投票功能的软件时,多个线程可以同时处理同一个人的票数。

下面通过一个示例看一下数据共享情况。首先对例8-5中的My Thread类进行修改。具体代码如下:

编写代码在主线程中创建5个My Thread线程,并启动这些线程。具体代码如下:

运行主线程将看到如下所示的效果。从运行结果中可以看到,线程C 和E 打印出的count值都是1,说明C和E同时对count进行处理,产生了“非线程安全”问题,但我们想要得到的打印结果却不是重复的,而是依次递减的。

在某些JVM 中,i--的操作要分成如下三步:

(1)取得原有i值;

(2)计算i-1;

(3)对i进行赋值

在这三个步骤中,如果有多个线程同时访问,那么一定会出现非线程安全问题。因为当某一个线程正在操控这个i而还没操作完成时,很可能有另外一个线程进来“打扰”这次操作,对结果造成影响。如何来避免这种“打扰呢”?

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈