Java线程同步互斥

Raven's Blog

Home Page View on GitHub Send Email

Java线程同步互斥

本文是本人对java多线程之间同步和互斥的一些简单的个人理解,只是为了便于理解,并不是jvm内部实际实现

线程互斥

多个线程需要用一些类动作来操作同一个共享数据,为了避免线程不可预料的先后顺序导致操作结果不确定,所以需要线程之间的互斥操作:

1.多线程如下图:

img

多个线程就像多个人要挤到一个房子里去进行一些列操作,如果没有互斥(不上锁),那么每个人都会进入房子里,甲进行了操作1,在操作2之前乙又进行了操作1,如果操作2依赖操作1,那么甲之后的操作就是错的了

2.互斥操作(加锁) img

互斥操作就如同为房子加了一把锁,每一时刻只有一个人能够进到房子里,当进行完所有操作后,离开房子,再与其他人一起共同竞争这个一人的进入机会,这样保证操作序列的原子性

线程同步

线程同步是为了保证多个线程之间有确定的先后顺序 img

接着: 2干完走人,4接着干,4干完后,会通知休息室:

如果使用Java5新增的Condition,则可以为锁建立多个休息室,比如生产者消费者问题中的 NotFullCondition NotEmptyCondition

信号量

img

java信号量(Semaphore)类似不止允许一个人进入的锁,可以用来控制并发总数,比如开始有6个人都在竞争进入房间(acquire()),当已经有三个进入房间后,其余的就会阻塞等待在门外,如果房间里有一个处理完毕(release()),那么房间外的就可以补充进来一个 当semaphore为1的信号量时,退化为普通的互斥锁


相关文章:

联系作者:aducode@126.com
更多精彩文章请点击:http://aducode.github.io