首页 > 代码库 > 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多线程,如何防止脏读数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。