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,顯然出現了臟讀數據了。

 

最后將變量保存在方法中,這個問題解決。

 

所以寫代碼要注意這個問題了..

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM