文档章节

线程的业务原子性

石飞飞
 石飞飞
发布于 2017/04/29 21:46
字数 354
阅读 18
收藏 1
  • 对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体性,不然就会出现数据不一致的错误,很经典的错误就是脏读(dirtyread)
  • 程序实例:
  • public class DirtyRead {
    
        private String username = "z3";
        private String password = "123";
    
    
        public synchronized void setValue(String username, String password) {
            this.username = username;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.password = password;
    
            System.out.println("setValue最终结果: username=" + username + ",password=" + password);
        }
    
        public void getValue() {
            System.out.println("getValue方法结果: username=" + this.username + ",password=" + password);
        }
    
        public static void main(String[] args) {
            final DirtyRead dr = new DirtyRead();
            new Thread(new Runnable() {
                public void run() {
                    dr.setValue("w5", "456");
                }
            }).start();
    
            dr.getValue();
        }
    }

    运行结果:

    • getValue方法结果: username=z3,password=123

    • setValue最终结果: username=w5,password=456

    • 结果分析:我们在通过setValue方法中设置的值,结果取出来的不是我们设置的值,说明了数据脏读,主线程和子线程在数据操作时不是业务原子性的。

  • 当我们给getValue()方法加上synchronized后,此时两个方法用的是同一把锁!

  • public class DirtyRead {
    
        private String username = "z3";
        private String password = "123";
    
    
        public synchronized void setValue(String username, String password) {
            this.username = username;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.password = password;
    
            System.out.println("setValue最终结果: username=" + username + ",password=" + password);
        }
    
        public synchronized void getValue() {
            System.out.println("getValue方法结果: username=" + this.username + ",password=" + password);
        }
    
        public static void main(String[] args) {
            final DirtyRead dr = new DirtyRead();
            new Thread(new Runnable() {
                public void run() {
                    dr.setValue("w5", "456");
                }
            }).start();
    
            dr.getValue();
        }
    }
    

    运行结果:

    setValue最终结果: username=w5,password=456
    getValue方法结果: username=w5,password=456

 

 

© 著作权归作者所有

上一篇: volatile关键字
下一篇: 线程同步工具类
石飞飞
粉丝 2
博文 64
码字总数 39883
作品 0
朝阳
程序员
私信 提问
iOS多线程之互斥锁

1.安全隐患解决-互斥锁 互斥锁使用格式 @synchronized(锁对象) { // 需要锁定的代码 }注意:锁定1份代码只用1把锁,用多把锁是无效的 互斥锁的优缺点 优点: 能有效防止因多线程抢夺资源造成...

JlongTian
2016/01/07
72
0
Ruby 的 GIL 和事务性内存

今早我发现了一篇很有趣的文章。: Eliminating Global Interpreter Locks in Ruby through Hardware Transactional Memory 当我阅读后发现这确实是个有趣的概念颠覆了我原有的观念. 何谓硬件...

oschina
2014/01/02
1K
4
简单说说你对Java内存模型的原子性的了解吧?

Java内存模型保证non-long、non-double类型外的其他任意类型的访问都是原子性的。同时volatile long、volatile double访问也是原子性的。 参考资料: 同步和Java内存模型 (二)原子性 除了lon...

nj-zhangmq
2016/12/09
23
0
【并发编程】volatile非原子的特性

一、前言: 上一遍博客中已经提及了volatile关键字虽然拥有了多个线程之间的可见性,但是却不具备同步性(也就是原子性),可以算的上是线程同步的轻量级实现,性能要比synchronized强很多,...

qq_26545305
2018/01/25
0
0
java高并发设计(一)--概念

java高并发的核心,要了解并熟悉java的内存模型,并涉及相关的资源临界值。 java的内存模型围绕多线的技术要点:原子性,可见性,有序性。 原子性:原子性是指整个操作过的不可中断性,明确的...

wangshuaixin
2016/12/27
142
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部