互斥锁/读写锁
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11395812.html
互斥锁
在访问共享资源之前进行加锁操作,在访问完成之后进行解锁操作。加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前线程解锁。如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都会变成就绪状态,第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。在这种方式下,只有一个线程能够访问被互斥锁保护的资源。举个形象的例子:多个人抢一个马桶
读写锁
读写锁既是互斥锁,又是共享锁,read模式是共享,write模式是互斥(排他锁),参考JUC包下的ReadWriteLock
读写锁的三种状态:读加锁,写加锁,不加锁
一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。只有一个线程可以占有写状态的锁,但可以有多个线程同时占有读状态的锁,这就是它可以实现高并发的原因。
当处于写状态锁时,任何想要尝试获得锁的线程都会被阻塞,直到写状态锁被释放。
当处于读状态锁时,允许其他线程获得它的读状态锁,但是不允许获得它的写状态锁,直到所有线程的读状态锁被释放。
为来避免想要尝试写操作的线程一直得不到写状态锁而处于线程饥饿,当读写锁感知到有线程想要获得写状态锁时,便会阻塞其后想要获得读状态的线程。所以读写锁非常适合多读少写的情况。
强者自救 圣者渡人