JAVA多線程編程核心技術(shù)--synchronized--解決臟讀[1]

什么是臟讀

什么是臟讀

  • 本次事務(wù)訪問到了其他事務(wù)未提交的數(shù)據(jù)

代碼

service.java

package com.service;

import java.util.ArrayList;
import java.util.List;

/**
 * 臟讀
 */
public class Service {

    private List<Object> lists = new ArrayList<Object>();

    public void print() throws InterruptedException {
        lists.add("abc");
        System.out.println("休息5秒鐘,制造臟讀場景大小是:" + lists.size());
        Thread.sleep(5000);
        lists.remove("abc");
        System.out.println("回退操作:" + lists.size());

    }

    public int getSize() {
        return lists.size();
    }
}

ThreadA.java

package com.service;

public class ThreadA extends Thread {

    private Service service;

    public ThreadA(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(200);
            int size = service.getSize();
            System.out.println(Thread.currentThread().getName()+ "->讀取到的大小是:"+size);
        } catch (InterruptedException e) {
            e.printStackTrace();

        }
    }
}

ThreadB.java

package com.service;

public class ThreadB extends Thread {

    private Service service;

    public ThreadB(Service service){
        this.service = service;
    }

    @Override
    public void run() {
        System.out.println("開始增加");
        try {
            service.print();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("結(jié)束增加");
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

Run.java

package com.service;

public class Run {
    public static void main(String[] args) {
        Service service = new Service();
        ThreadA a = new ThreadA(service);
        a.setName("A");
        a.start();

        ThreadB b = new ThreadB(service);
        b.setName("B");
        b.start();
    }
}

運(yùn)行結(jié)果是:

開始增加
休息5秒鐘,制造臟讀場景大小是:1
A->讀取到的大小是:1
回退操作:0
結(jié)束增加

Process finished with exit code 0

解決方法

  • 增加鎖synchronized

service.java

public class Service {
    //線程不安全的類
    private List<Object> lists = new ArrayList<Object>();

    public void print() throws InterruptedException {
        synchronized (Service.class){
            lists.add("abc");
            System.out.println("休息5秒鐘,制造臟讀場景大小是:" + lists.size());
            Thread.sleep(5000);
            lists.remove("abc");
            System.out.println("回退操作:" + lists.size());
        }
    }

    public int getSize(){
        synchronized (Service.class){
            return lists.size();
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容