java线程安全之synchronized同步代码块解决脏读问题(四)
2017-11-16 10:36
615 查看
概念理解
对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,很经典的错误就是脏读(dirtyread)案例
package cn.hfbin.sync004; /** * 业务整体需要使用完整的synchronized,保持业务的原子性。 * @author cn.hfbin * */ public class DirtyRead { private String username = "cn.hfbin"; private String password = "123"; public 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 = " + this.password); } public static void main(String[] args) throws Exception{ final DirtyRead fb = new DirtyRead(); Thread t1 = new Thread(new Runnable() { @Override public void run() { fb.setValue("hfbin", "456"); } }); t1.start(); Thread.sleep(1000); fb.getValue(); } }
打印结果:
getValue>>>>方法得到:username = hfbin , password = 123 setValue>>>>最终结果:username = hfbin , password = 456
如果在 setValue()和getValue()方法同时加上synchronized修饰 打印结果如下:
getValue>>>>方法得到:username = hfbin , password = 456 setValue>>>>最终结果:username = hfbin , password = 456
注意:不能只在 setValue()和getValue()方法中任意一个加synchronized,否则还是会出现脏读现象
结论
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为setValue/getValue方法同时加锁synchronized同步关键字,保证业务(service)的原子性,不然会出现业务错误(也从侧面保证业务的一致性)。源代码:https://github.com/hfbin/Thread_Socket/tree/master/Thread/sync004
相关文章推荐
- java中同步synchronized的意义,如何用它解决线程不安全的问题
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 实例解析Java中的synchronized关键字与线程安全问题
- Java SimpleDateFormat 线程不安全问题及解决方法
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- Java线程安全问题及线程安全解决方法
- java 多线程(线程间通信-解决安全问题)
- 基础篇_线程 第4集 多线程的安全问题--解决之道同步代码块
- java通过代码控制线程状态,解决线程不安全的问题。
- 黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁
- 完美解决Java中的线程安全问题
- 线程安全问题:同步代码块synchronized
- 实例解析Java中的synchronized关键字与线程安全问题
- 浅谈利用同步机制解决Java中的线程安全问题
- 线程安全问题-———售票问题————同步代码块解决
- java中如何解决线程不安全的问题呢?
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- java线程的同步安全问题三种解决办法
- java解决线程不安全问题的方法
- java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--下篇