Java并发编程---业务数据的脏读问题
2017-12-24 17:43
351 查看
1.脏读
概念:对于对象的同步和异步的方法,我们在设计自己的程序时,一定要考虑问题的整体性,不然就会出现数据不一致的错误,很经典的就是脏读问题
2.示例代码
3.代码分析:
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为setValue/getValue方法同时加锁synchronized同步关键字,保证业务(service)的原子性,不然会出现业务错误(也从侧面保证业务的一致性)
4.截图:
4.1 setValue/getValue方法同时加锁synchronized同步关键字
4.2 getValue方法去掉加锁synchronized同步关键字
概念:对于对象的同步和异步的方法,我们在设计自己的程序时,一定要考虑问题的整体性,不然就会出现数据不一致的错误,很经典的就是脏读问题
2.示例代码
package com.thread.objectLock; /** * 业务数据的脏读问题(对象锁的同步与异步知识延伸) * 要求取出的数据要有一致性,即读前和读后 * 避免脏读,要保证加锁的一致性,或加读写分离锁 * @author lhy * @time 2017.12.22 * */ public class DirtyRead { private String username = "haige"; private String password = "123"; public synchronized void setValue(String username, String password){ this.username = username; try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.password = password; System.out.println("setValue最终结果: username = " + username + ", password = " + password); } //初始时皆有synchronized,为了反映脏读问题,去掉该方法的synchronized public synchronized void getValue(){ System.out.println("getValue方法得到: username = " + this.username + ", password = " + this.password); } public static void main(String[] args) throws Exception { final DirtyRead dr = new DirtyRead(); Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub dr.setValue("lhy", "456"); } }); t1.start(); Thread.sleep(1000); dr.getValue(); } }
3.代码分析:
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为setValue/getValue方法同时加锁synchronized同步关键字,保证业务(service)的原子性,不然会出现业务错误(也从侧面保证业务的一致性)
4.截图:
4.1 setValue/getValue方法同时加锁synchronized同步关键字
4.2 getValue方法去掉加锁synchronized同步关键字
相关文章推荐
- Java并发编程之同步互斥问题
- java 并发编程学习笔记之volatile意外问题的正确分析解答
- Java Socket 多线程编程,处理百万级的数据并发。
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- Java并发编程-15-并发任务间数据交换
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)
- 【Java并发编程】:线程间通信中notifyAll造成的早期通知问题(含代码)
- java后台并发插入数据问题
- 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)
- moon java 并发的基础知识 以编程思想的第21章为总体概览及问题
- Java无线数据增值业务的几个核心问题
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- Java并发编程-10-在锁中使用多条件-生产者消费者问题
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- JAVA 并发编程-多个线程之间共享数据(六)
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
- 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)