线程锁

xiaoxiao2021-02-28  14

线程锁

    在java多线程中,我可以使用synchronized关键字实现线程间的同步互斥工作。其实还有一个更优秀的机制去完成这个同步互斥工作,就是lock锁。lock锁主要分两种:重入锁和读写锁。它们具有比synchronized更优秀的功能,比如嗅探锁定,多路分支等功能。lock锁在jdk1.8之前性能要比synchronized好,但后来synchronized也做了优化,性能上现在并无太大差异,主要lock锁更加灵活。ReentrantLock(重入锁)    重入锁,需要在进行同步的代码部分加上锁定,但不要忘记最后一定要在finally中释放锁定,不然会造成锁永远无法释放,其他线程永远无法进来的结果。锁的等待与通知    在使用synchronized的时候,如果需要多线程之间协同工作,则需要Object中的wait()和notify()以及notifyAll()方法进行配合工作。Condition:        那么同样在使用lock时,可以使用一个新的等待通知的类,就是Condition。Condition是针对具体某一把锁的。也就是只有在具有锁的基础之上才可以使用Condition。        我们可以通过一个lock对象产生多个Condition进行多线程间的交互,非常的灵活。可以使得部分需要被唤醒的线程唤醒,其他线程则继续等待通知。锁默认是非公平锁,效率要高于公平锁,因为公平锁要维护顺序所以需要消耗性能。        公平锁按照代码执行先后顺序上锁并执行,非公平锁按照cpu分配执行。        tryLock()尝试获得锁,结果返回true,false(嗅探锁)ReentrantReadWriteLock(读写锁)        读写锁核心就是实现读写分离的锁。在高并发访问下,尤其是读多写少的情况,性能要高于重入锁。如果读少写多的情况还是推荐使用重入锁。        synchronized和ReentrantLock,同一时间只能有一个线程访问被锁定的代码。读写锁则不同,其本质是分成两个锁。即读锁和写锁。在读锁下,多个线程可以进行并发的访问,但在写锁的时候,线程只能一个一个进行顺序访问。分布式锁:        当进行分布式业务时,将同样的web应用部署在两台不同的服务器上形成集群,就意味着是两个不同的jvm,分布式锁的情况下当一个线程进入集群中的一台服务器执行写操作时,其他线程就不允许进入,但是因为是不同的jvm单独使用java语言是不能实现分布式锁的。所以必须使用第三方工具,如zookeeper。首先在zookeeper中注册应用。然后由zookeeper加锁进行调度。

转载请注明原文地址: https://www.6miu.com/read-1750222.html

最新回复(0)