首页 > 代码库 > 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,显然出现了脏读数据了。

 

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

 

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

 

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