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,显然出现了脏读数据了。

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

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

  • 相关阅读:
    如何使用 ADO 将数据从 ADO 数据源传输到 Excel
    C#2.0中的可空类型Nullable
    2007年你必须学习的10项.NET技术
    日期正则表达式
    只允许n个实例进行
    MFC程序隐藏任务栏图标的三种方法
    Qt4小技巧——将button布局在QToolbar的右边
    QT学习随笔20120813
    只允许一个实例,允许n个实例
    折腾的DVCS
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059765.html
Copyright © 2011-2022 走看看