Java synchronized
来源:互联网 发布:小智淘宝店男装 编辑:程序博客网 时间:2024/06/05 19:57
首先要理解多线程和数据一致性。
举个栗子,最简单的,两个线程,一个线程是你,一个线程是你老婆,你俩各有一张银行卡,但是两张银行卡对应一个账户。某个时间(比如早上10点整),银行卡里还有500块钱。你老婆看见一件裙子,刚好500块,特别喜欢,剁手也得买,10点01分01秒下单;你在steam上看到一款期盼已久的游戏打折了,刚好500,剁手也得买,10点01分02秒,你看账户里还有500块,买买买。这时,你俩都下单成功,并完成了支付,各自都得到了想要的东西,美滋滋的,世界真美好~
咳咳咳,行了,想想得了,你以为银行傻吗?显然这不现实,500块让你当1000花,这样银行早破产关门了。事情是这样滴,整个交易过程是受到保护的,这叫事务(自行百度),一次事务执行过程中为了保持一致性,只能有一个人操作,别的人甭想对账户里的钱进行任何操作(读写),就像去ATM机取钱,你老婆比你提前1秒进到ATM的小屋里,并锁上了门,等她取完500块,出来了,你才能进去(你被阻塞,block),这时你猜账户里还有多少钱?嘿嘿嘿
咳,栗子有点糊,凑活吃吧。当多个线程对一个特定的数据进行操作时,为了保持一致性,这里需要锁,而Synchronized是一种简单的方法达到锁的效果,给你提供线程安全。
Synchronized可以用来描述方法,也可以用来描述声明,例如
描述方法:
public class SynchronizedBank{
private int c = 0;
public synchronized void doBusiness(){
取钱;
开卡;
挂失;
贷款;
}
}
上面这个doBusiness是进入银行办业务,加了synchronized关键字相当于门口站个保安,一次只让一个人进出,这样的话,银行门口可就排大队了。这样做虽然安全,但是不太合情理,我们只想限制取钱的人。
所以有了Synchronized的第二种使用方式,用来描述statement声明,
public class SynchronizedBank{
private int c = 0;
public void doBusiness(){
synchronized(this){
取钱;
}
开卡;
挂失;
贷款;
}
}
这样相当于在银行大厅旁边设计个小屋子当ATM机的房间,要去ATM取钱的才用去排队,其他人可以该开卡就开卡,该贷款就办贷款,毕竟银行柜台很多,业务员人很多,当然处理同一个人的银行业务也只能在一个柜台办理。- Java synchronized
- Java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- Java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- java synchronized
- Java synchronized
- Java synchronized
- Java synchronized
- Linux crontab定时执行任务 命令格式与详细例子
- Linux 虚拟机:Network error: Connection refused 排查
- CodeForces743D
- python: os 库
- mybatis mysql 主键自增
- Java synchronized
- 2017.6.27 python学习 高阶函数
- 【视频开发】【计算机视觉】doppia编译之一:前言及安装CUDA
- ant+jmeter+jenkins搭建持续性能测试,接口测试平台
- 十五天精通WCF——第十二天 说说wcf中的那几种序列化
- 【STL】堆
- Python: shutil模块 常用api速查表
- 【学生】学生信息管理遇到的问题
- 小程序-网络请求封装