zoukankan      html  css  js  c++  java
  • java多线程,如何防止脏读数据

    多线程容易“非线程安全”的情况,是由于用了全局变量,而又没有很好的控制起情况。所以无论做什么程序,谨慎使用全局变量

    "非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏”读。

    如以下代码就会出现“脏”读的情况:

    package com.ming.thread.t1;
    
    public class Count {
    
        int count=0;
        
        public void add(String str){
            if("a".equals(str)){
                count=100;
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(count);
            }else{
                count=200;
                System.out.println(count);
            }
        }
    }

    建立两个线程:

    package com.ming.thread.t1;
    
    public class ThreadA extends Thread{
    
        private Count count;
        
        public ThreadA(Count count){
            this.count=count;
        }
        
        public void run(){
            count.add("a");
        }
    }
    package com.ming.thread.t1;
    
    public class ThreadB extends Thread{
    
        private Count count;
        
        public ThreadB(Count count){
            this.count=count;
        }
        
        public void run(){
            count.add("b");
        }
    }

    在建立一个测试类:

    package com.ming.thread.t1;
    
    public class Test {
    
        public static void main(String[] args) {
            Count count=new Count();
            ThreadA a=new ThreadA(count);
            a.start();
            ThreadB b=new ThreadB(count);
            b.start();
        }
    }

    最后输出:200 200,显然出现了脏读数据了。

    最后将变量保存在方法中,这个问题解决。

    所以写代码要注意这个问题了..

  • 相关阅读:
    自己实现简单Spring Ioc
    java中动态代理的实现
    Token以及签名signature的设计与实现
    Spring boot整合jsp
    spring boot+mybatis整合
    java并发基础(六)--- 活跃性、性能与可伸缩性
    java并发基础(五)--- 线程池的使用
    java并发基础(四)--- 取消与中断
    java并发基础(三)--- 任务执行
    java并发基础(二)
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059765.html
Copyright © 2011-2022 走看看