2.1.5脏读(dirtyRead)

来源:互联网 发布:什么是淘宝的企业店铺 编辑:程序博客网 时间:2024/06/10 09:09

package cha02.execise06;/** * Created by sunyifeng on 17/9/20. */public class ThreadA extends Thread {    private PublicVar publicVar;    public ThreadA(PublicVar publicVar){        super();        this.publicVar = publicVar;    }    @Override    public void run(){        super.run();        publicVar.setValue("B","BB");    }}
package cha02.execise06;/** * Created by sunyifeng on 17/9/20. */public class ThreadA extends Thread {    private PublicVar publicVar;    public ThreadA(PublicVar publicVar){        super();        this.publicVar = publicVar;    }    @Override    public void run(){        super.run();        publicVar.setValue("B","BB");    }}
package cha02.execise06;/** * Created by sunyifeng on 17/9/20. */public class Run {    public static void main(String[] args) {        try {            PublicVar publicVar = new PublicVar();            ThreadA threadA = new ThreadA(publicVar);            threadA.start();            Thread.sleep(200);            publicVar.getValue();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

getValue方法,线程名称:main,用户名和密码:B,AA
setValue方法,线程名称:Thread-0,用户名和密码:B,BB

程序分析:虽然在赋值时进行了同步、但是取值时没有同步,造成脏读。

加上同步锁

synchronized public void getValue() {    System.out.println("getValue方法,线程名称:" + Thread.currentThread().getName() + ",用户名和密码:" + username + "," + password);}
运行结果:

setValue方法,线程名称:Thread-0,用户名和密码:B,BB
getValue方法,线程名称:main,用户名和密码:B,BB

程序分析:

1、当线程A调用有同步的方法时,线程A就获得对象锁,其他线程必须等线程A执行完;但是,其他线程可以调用对象的非同步的方法(没有加synchronized的方法)。

2、如果两个方法都加了synchronized(两个方法都是同步的),线程A调用方法1、线程B调用方法2,则必须线程A执行完之后,线程B才能执行。



原创粉丝点击