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

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

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

  • 相关阅读:
    面向对象--接口的实际应用--制定标准
    iconv命令 gbk 转 UTF-8
    map,list
    springMVC配置(XML配置详解)
    关于git-Git 分支管理和冲突解决
    使用Intellij idea开发
    Centos7.2 Install subversion server
    Nginx 多域名配置
    Nginx 解析PHP的原理 | CGI、FastCGI及php-fpm的关系
    Centos7 Yum安装 PHP5.5,5.6,7.0
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059765.html
Copyright © 2011-2022 走看看