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

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

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

  • 相关阅读:
    checkListbox的单选
    IP地址控件CIPAddressCtrl类的使用
    C++ Socket编程步骤
    环形缓冲区
    隐式链接和显示链接的区别
    memset、memcpy的使用方法!
    cetlm下载地址
    安装 GCC
    centos 配置代理
    make软件包安装
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059765.html
Copyright © 2011-2022 走看看