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

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

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

  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059765.html
Copyright © 2011-2022 走看看