某个线程是否锁住同步资源
- 悲观锁每次拿资源时候都认为会有人修改,在读数据的时候都会上锁,其他线程就会阻塞直到拿到锁。
- 乐观锁是每次拿到数据的时候,都假设别人不会修改,都不会上锁。只有在更新数据的时候,去判断之前有没有线程更新了这个数据。如果这个数据没有更新过。当前线程就会将自己修改的线程成功写入。如果当前数据已经被更新了,当前线程要么自动重试,要么报错。
多个线程是否共享一把锁
- 共享锁是指锁可以被多个线程持有,如果一个线程对数据加共享锁之后,那么其他线程只能对数据加共享锁,不能加独占锁。获得共享锁,只能读不能修改数据。JDK中,ReentrantReadWriteLock就是一种共享锁。
- 独占锁指锁一次只能被一个线程所持有。如果一个线程对数据加排他锁后,该线程可以对数据读和写,其他线程不能对他进行任何操作。 JDK中的synchronized和JUC包中的Lock实现类都是独占锁。
- 互斥锁是独占锁的一种形式。指一个资源同时只允许一个访问者对他进行访问。具有唯一性和排他性。互斥锁一次只能有一个线程拥有互斥锁。其他线程只能等待。
- 读写锁是共享锁的一种具体体现,读写锁是管理一组锁,一个是只读的锁,一个是只写的锁,读锁在没写锁的时候被多个线程持有,写锁只能是独占的。写锁的优先级要高于读锁,一个获取了读锁的线程,一定要能看见前一个写锁更新的内容。读写锁相比于互斥锁并发的程度更高。
JDK源码中定义读写锁接口ReadWriteLock。ReentrantReadWriteLock实现上述接口,支持锁降级不支持锁升级,可以由写锁降级为读锁。
转载:https://www.bilibili.com/video/BV1ug411a7Jb/?vd_source=46d50b5d646b50dcb2a208d3946b1598
标签:java,独占,互斥,读锁,线程,共享,数据 From: https://www.cnblogs.com/chenyi502/p/16793045.html