码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程,如何防止脏读数据

时间:2017-06-21 15:56:38      阅读:424      评论:0      收藏:0      [点我收藏+]

标签:rup   test   void   解决   防止   print   extends   class   控制   

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

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

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

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

 

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

 

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

 

java多线程,如何防止脏读数据

标签:rup   test   void   解决   防止   print   extends   class   控制   

原文地址:http://www.cnblogs.com/huzi007/p/7059765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!