java线程安全之synchronized同步代码块解决脏读问题(四)
来源:互联网 发布:小米手机淘宝旗舰店 编辑:程序博客网 时间:2024/06/17 08:16
概念理解
对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,很经典的错误就是脏读(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 = 123setValue>>>>最终结果:username = hfbin , password = 456
如果在 setValue()和getValue()方法同时加上synchronized修饰 打印结果如下:
getValue>>>>方法得到:username = hfbin , password = 456setValue>>>>最终结果:username = hfbin , password = 456
注意:不能只在 setValue()和getValue()方法中任意一个加synchronized,否则还是会出现脏读现象
结论
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为setValue/getValue方法同时加锁synchronized同步关键字,保证业务(service)的原子性,不然会出现业务错误(也从侧面保证业务的一致性)。
源代码:https://github.com/hfbin/Thread_Socket/tree/master/Thread/sync004
阅读全文
0 0
- java线程安全之synchronized同步代码块解决脏读问题(四)
- java线程安全之synchronized代码块(六)
- java线程安全之同步函数和同步代码块
- 线程同步问题 解决同步问题的方法 synchronized方法 同步代码块
- 同步代码块解决线程安全
- 多线程(四)线程的同步之同步代码块
- JAVA 同步代码块synchronized
- java synchronized(同步代码块)
- (二) Java多线程详解之Synchronized同步代码块和线程通信详解
- java多线程之-----静态同步synchronized方法与synchronized(class) 代码块
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
- 线程安全问题:同步代码块synchronized
- 饿汉式不用同步代码块实现线程安全的问题
- 线程(六)--线程同步--synchronized(同步代码块,同步方法)
- Java synchronized的理解!(线程安全,线程同步)
- 线程同步总结--synchronized方法和synchronized代码块
- 线程并发四:线程安全之synchronized
- 线程安全问题之线程同步机制(同步代码块)
- 月薪过万加班不断,这个行业叫……
- 【干货#015】小程序收货地址
- Spring Data JPA根据属性名查询方法
- 手机的" 32K,26M时钟电路"作用 (转载于 52rd zsqt8888的专栏)
- Java性能优化指南系列(三):理解JIT编译器
- java线程安全之synchronized同步代码块解决脏读问题(四)
- 时间格式化hh:mm:ss和HH:mm:ss
- 数据结构-非递归遍历二叉树
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- ios用webview文件加载
- Path Sum III
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例
- CentOS 7安装python3.6
- 升级到ckplayerX