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取钱的才用去排队,其他人可以该开卡就开卡,该贷款就办贷款,毕竟银行柜台很多,业务员人很多,当然处理同一个人的银行业务也只能在一个柜台办理。




原创粉丝点击