Java多线程之对写业务加锁,对读业务不加锁,会产生脏读

 1 import java.util.concurrent.TimeUnit;
 2
 3 /**
 4  * 对写业务加锁
 5  * 对读业务不加锁
 6  * 脏读
 7  */
 8 public class Account {
 9
10     String name;
11     double balance;
12
13     public synchronized void set(String name, double balance) {
14         this.name = name;
15         try {
16             Thread.sleep(2000); //写线程休眠两秒
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         }
20         this.balance = balance;
21     }
22
23     /**
24      * 解决脏读在方法上加synchronized
25      * @param name
26      * @return
27      */
28     public /*synchronized*/ double getBalance(String name) {
29         return this.balance;
30     }
31
32     public static void main(String[] args) {
33
34         Account account = new Account();
35         new Thread(() -> account.set("张三", 100.0)).start();
36
37         try {
38             TimeUnit.SECONDS.sleep(1); //读线程休眠一秒
39         } catch (InterruptedException e) {
40             e.printStackTrace();
41         }
42
43         System.out.println(account.getBalance("张三"));
44
45         try {
46             TimeUnit.SECONDS.sleep(2); //读线程休眠两秒
47         } catch (InterruptedException e) {
48             e.printStackTrace();
49         }
50
51         System.out.println(account.getBalance("张三"));
52
53     }
54
55 }

原文地址:https://www.cnblogs.com/mxh-java/p/12246451.html

时间: 2024-08-29 07:30:25

Java多线程之对写业务加锁,对读业务不加锁,会产生脏读的相关文章

java多线程、并发系列之 (synchronized)同步与加锁机制

Synchronized Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步. 当程序运行到synchronized同步方法或代码块时才该对象锁才起作用. 一个对象只有一个锁.所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁.这也意味着任何其他线程都不能进入该对象上的synchronized方法

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

【转】40个Java多线程问题总结

文章转自 五月的仓颉 http://www.cnblogs.com/xrq730/p/5060921.html 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作

java 多线程问题总结

原文出处: http://www.cnblogs.com/xrq730/p/5060921.html 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是

java多线程系列——(1)写在前面

写在前面 本系列博客主要针对java多线程的基础知识以及对基础的扩展,让大家更好的去理解和掌握java多线程方面的知识. 注:我将会用通俗易懂的语言去阐述java多线程的相关知识,必要的时候会结合图来说明,大家有不明白的地方欢迎留言给我,我会逐一回复的! 针对java多线程,以下知识点是十分重要的: 线程和进程的区别 java创建线程的两种方式 start方法和run方法的区别 线程的生命周期 synchronized块和synchronized关键字的使用技巧和适应场景 volitale关键字

Java多线程编程模式实战指南(二):Immutable Object模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(ReentrantLock)以及读写锁(ReentrantReadWriteLock). 1. ReentrantLock 在Java多线程(二) 多线程的锁机制 里面,已经总结过通过使用Synchronized关键字实现线程内的方法锁定.但使用Synchronized关键字有一些局限性,上锁和释放锁是由JVM决定的

Java多线程感悟二

写在前面 这篇是Java多线程感悟的第二篇博客,主要讲述的JAVA层面对并发的一些支持.第一篇博客地址为:http://zhangfengzhe.blog.51cto.com/8855103/1607712  下一篇博客将介绍线程池和一些同步工具类. 目录 9.  并发内存模型及并发问题概述 10. volatile和synchronized原理分析 11. ThreadLocal原理及其在Struts/Spring中的应用 12. Atomic 13. Lock 并发内存模型及并发问题概述 首