互斥锁
典型的互斥锁:synchronzied
一次最多只能有一个线程持有的锁。如Java的Lock。
共享资源的使用是互斥的,即一个线程获得资源的使用权后就会将该资源加锁,使用完后会将其解锁, 如果在使用过程中有其他线程想要获取该资源的锁,那么它就会被阻塞陷入睡眠状态,直到该资源被解锁才会被唤醒, 如果被阻塞的资源不止一个,那么它们都会被唤醒,但是获得资源使用权的是第一个被唤醒的线程,其它线程又陷入沉睡。
读写互斥场景有:读-读互斥、读-写互斥、写-读互斥、写-写互斥
读写锁
典型的读写锁:ReentrantReadWriteLock、CopyOnWriteArrayList、CopyOnWriteArrayset
读写锁既是互斥锁,又是共享锁,read模式是共享,write是互斥(排它锁)的。
读写锁有三种状态 :
- 读加锁状态
- 写加锁状态
- 不加锁状态
读写锁能在读频率更高的情况下有更好的并发性能:
- 如果有其它线程读数据, 则允许其它线程执行读操作, 但不允许写操作
- 如果有其它线程写数据, 则其它线程都不允许读和写操作
读写锁的经典例子有 ReentrantReadWriteLock
网友评论