线程锁

线程锁

    在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加锁进行调度。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值