自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间进行交互时是很重要的一个技术点。
图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而还没操作完成时,很可能有另外一个线程进来“打扰”这次操作,对结果造成影响。如何来避免这种“打扰呢”?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。