多线程之实例变量与线程安全

一:线程间数据不共享的实例

  1.  创建一个继承Thread类的java对象
            多线程之实例变量与线程安全_第1张图片
  2.  测试类
           多线程之实例变量与线程安全_第2张图片
  3.  效果:
           多线程之实例变量与线程安全_第3张图片
  4.  结论
            我们创建了3个线程,每个线程都有各自的count变量,自己减少自己的count
     变量的值。这样的情况就是线程间变量不共享。 
  5. 结构图如下:
     多线程之实例变量与线程安全_第4张图片        
     表示线程间的数据不共享,各自存在各自的变量。

二:线程间数据共享的实例一

  1. 简介
           在JVM中,i--这个变量的操作是要分为如下3步:
                  a:获取原有的i值
                  b:计算i-1
                  c:对i进行赋值
            那么,在这3个步骤中,如果有多个线程同时访问,那么一定会出现线程的安全问题。
  2. 实例Demo如下:
            ⑴创建继承Thread类的对象
                  多线程之实例变量与线程安全_第5张图片
            ⑵测试类
                  多线程之实例变量与线程安全_第6张图片
             ⑶效果:
                  多线程之实例变量与线程安全_第7张图片
              ⑷结论:
                         a:首先我们在MyThread.java这个类的run方法前加上了synchronized关键字,使多个
                  线程在执行run方法时,以排队的形式进行处理。当一个线程调用run方法前,先判断run
                  方法有没有被上锁,如果上锁,说明有其它线程正在调用run方法,必须等其它线程对run
                  方法调用结束后才能执行run方法。这样就实现了排队调用run方法的目的,也就达到了按
                  顺序对count变量减1的效果了。synchronized可以在任意对象及方法上加锁,而加锁的这段
                  代码称为“互斥区”或“临界区”。
                         b:我们在测试类中只new了一个MyThread线程实例,然后基于这个线程实例我们创建
                               了5个Thread线程来调用MyThread这个线程实例(根据Java实例的特性,new 的一个
                               MyThread实例,不同的Thread实例调用的是同一个MyThread实例,那么对应的这
                               5个Thread线程A,B,C,D,E处理的都是MyThread这一个实例中的数据。)  
  3. 结构图
         多线程之实例变量与线程安全_第8张图片           

三:线程间数据共享的实例二

  1. 创LoginServlet类
            多线程之实例变量与线程安全_第9张图片
  2. 创建继承Thread的ALogin类
          多线程之实例变量与线程安全_第10张图片
  3. 创建继承Thread的BLogin类
          多线程之实例变量与线程安全_第11张图片
  4. 测试类
          多线程之实例变量与线程安全_第12张图片
  5. 效果
          多线程之实例变量与线程安全_第13张图片
          原因就是当a线程sleep的时候,b线程将usernameRef这个全局变量值给改
          掉了,所以造成了线程变量安全问题。
  6. 解决办法
          多线程之实例变量与线程安全_第14张图片
          效果:
          多线程之实例变量与线程安全_第15张图片 

你可能感兴趣的:(多线程)