Java 学习笔记之 线程脏读

线程脏读:

 

发生脏读的情况是在读取实例变量时,值已经被其他线程更改过了。

public class DirtyReadVar {
    public String username = "A";
    public String password = "AA";
    synchronized public void setValue(String username, String password) {
        try {
            this.username = username;
            Thread.sleep(5000);
            this.password = password;
            System.out.println("setValue method thread name = " + Thread.currentThread().getName() + " username = " + username + " password = " + password);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void getValue(){
        System.out.println("getValue method thread name = " + Thread.currentThread().getName() + " username = " + username + " password = " + password);
    }

}

public class DirtyReadVarThread extends Thread {
    private DirtyReadVar dirtyReadVar;

    public DirtyReadVarThread(DirtyReadVar dirtyReadVar) {
        this.dirtyReadVar = dirtyReadVar;
    }

    @Override
    public void run() {
        super.run();
        dirtyReadVar.setValue("B", "BB");
    }
}

public class ThreadRunMain {
    public static void main(String[] args) {
        testDirtyReadVarThread();
    }

    public static void testDirtyReadVarThread(){
        try {
            DirtyReadVar dirtyReadVar = new DirtyReadVar();
            DirtyReadVarThread thread = new DirtyReadVarThread(dirtyReadVar);
            thread.start();
            Thread.sleep(200);
            dirtyReadVar.getValue();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

出现脏读是因为getValue()方法没有同步,可以在任意时候进行调用。解决方法就是加上synchronized关键字:

public class DirtyReadVar {
    public String username = "A";
    public String password = "AA";
    synchronized public void setValue(String username, String password) {
        try {
            this.username = username;
            Thread.sleep(5000);
            this.password = password;
            System.out.println("setValue method thread name = " + Thread.currentThread().getName() + " username = " + username + " password = " + password);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public void getValue(){
        System.out.println("getValue method thread name = " + Thread.currentThread().getName() + " username = " + username + " password = " + password);
    }

}

运行结果:

 

转载于:https://www.cnblogs.com/AK47Sonic/p/7713504.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值