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

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

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

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

  1. 简介
           在JVM中,i--这个变量的操作是要分为如下3步:
                  a:获取原有的i值
                  b:计算i-1
                  c:对i进行赋值
            那么,在这3个步骤中,如果有多个线程同时访问,那么一定会出现线程的安全问题。
  2. 实例Demo如下:
            ⑴创建继承Thread类的对象
                  
            ⑵测试类
                  
             ⑶效果:
                  
              ⑷结论:
                         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. 结构图
                    

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

  1. 创LoginServlet类
            
  2. 创建继承Thread的ALogin类
          
  3. 创建继承Thread的BLogin类
          
  4. 测试类
          
  5. 效果
          
          原因就是当a线程sleep的时候,b线程将usernameRef这个全局变量值给改
          掉了,所以造成了线程变量安全问题。
  6. 解决办法
          
          效果:
           
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值