美文网首页
1.8 模拟脏读(dirtyRead)问题

1.8 模拟脏读(dirtyRead)问题

作者: 殊胜因缘_Chris | 来源:发表于2019-03-02 22:26 被阅读0次
/**
 * This is description.
 * 模拟脏读(dirtyRead): 对业务写方法加锁, 对业务读方法不加锁, 可能会出现脏读.
 *
 * @author Chris Lee
 * @date 2019/3/2 16:29
 */
public class Account {
    String name;
    double balance;

    /**
     * 写方法进行加锁, 设置账户名和余额.
     *
     * @param name
     * @param balance
     */
    public synchronized void setAccount(String name, double balance) {
        this.name = name;

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        this.balance = balance;
    }

    /**
     * 读方法: 获取账户余额.
     * 加锁就避免了脏读, 为什么?
     * 原因:
     * 对非静态方法加锁实质上是锁定了堆中的对象, 写和读方法同时加锁, 那么读方法就必须等待写方法的锁释放之后(此时name和balance均赋值成功),
     * 才能获得该对象锁, 从而避免了脏读.
     * @return
     */
    public /*synchronized*/ double getBalance() {
        return this.balance;
    }

    public static void main(String[] args) {
        Account account = new Account();
        new Thread(() -> account.setAccount("Chris", 100.0)).start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("the balance of Chris is : " + account.getBalance());

        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("the balance of Chris is : " + account.getBalance());

        /*
        读方法不加锁:
            the balance of Chris is : 0.0(脏读产生)
            the balance of Chris is : 100.0
        读方法加锁:
            the balance of Chris is : 100.0
            the balance of Chris is : 100.0
         */
    }

}
说明:
  • 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢!
  • 世上有4样东西可以让世界变得更美好, 它们是: 代码(Code), 诗(Poem), 音乐(Music), 爱(Love). 如有兴趣了解更多, 欢迎光顾"我的文集"相关文章.
资料:
  1. 学习视频: https://www.bilibili.com/video/av11076511/?p=1
  2. 参考代码: https://github.com/EduMoral/edu/tree/master/concurrent/src/yxxy
  3. 我的代码: https://github.com/ChrisLeejing/learn_concurrency.git

相关文章

  • 1.8 模拟脏读(dirtyRead)问题

    说明: 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢! 世上有4样东西可以让世界变得...

  • 脏读问题

    对业务写方法加锁,对业务读方法不加锁会出现脏读的情况 运行结果如下:

  • MySQL Innodb 事务隔离级别

    Reference 事务并发的可能问题与其解决方案脏读、幻读、不可重复读和丢失更新数据库并发事务存在的问题(脏读、...

  • SQL 多个事务并发时可能遇到的问题

    Reference 事务并发的可能问题与其解决方案脏读、幻读、不可重复读和丢失更新数据库并发事务存在的问题(脏读、...

  • Spring事务级别

    事务级别涉及到到问题主要有脏读,不可重复读,幻读,这里分别描述一下,并对相应的事务级别进行整理。 脏读 :脏读就是...

  • 事务隔离级别

    Mysql锁(七)丢失更新,脏读,不可重复读,幻读 ****这些问题的出现的原因**** 之所以出现更新丢失,脏读...

  • mysql数据mvcc版本控制原理

    事务并发执行遇到的问题 脏读(未提交读) 不可重复读(已提交读) 幻读(读出新纪录) 事务隔离级别 隔离级别脏读不...

  • Mysql事务的隔离级别

    Read uncommitted - 读未提交(会出现脏读的问题) Read committed - 读提交 (会...

  • Spring 事务隔离级别

    出现问题:脏读 ,不可重复读,幻读 脏读 :读到了别的事务回滚前的脏数据,例如:事务B执行过程中修改了数据X,在未...

  • flink 问题总结(4)如何读取sequence 文件

    请移步 flink问题总结目录 (不断更新中) 问题: flink1.8 如何读HDFS的sequence 文件?...

网友评论

      本文标题:1.8 模拟脏读(dirtyRead)问题

      本文链接:https://www.haomeiwen.com/subject/fsquuqtx.html