脏读代码如下: package com.study.thread; public class ZhangDuTest { private String username="init_username"; private String password="init_password";; public synchronized void setValue(String username,String password){ this.username=username; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } this.password=password; System.out.println("username= " +username +" password=" + password); } public void getValue(){ this.password=password; System.out.println("username= " +username +" password=" + password); } public static void main(String[] args) { ZhangDuTest t1 = new ZhangDuTest(); new Thread(new Runnable() { @Override public void run() { t1.setValue("username","password"); } }).start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } t1.getValue(); } }
输出结果如下:
这个时候 需要在 getValue 上 synchronized
这样结果输出成功
数据库脏读
九点进行一次查询,查询是九点开始,查询数据非常大,九点10 分才能结束,但是 九点5 分 另外一个线程update 这个字段,那10 分的查询 返回的是 update 之后的数据吗?
答案是 不是,九点这一刻查询,那么返回的数据一定是 九点这一刻的 数据