多线程——锁策略

        乐观锁和悲观锁

        乐观锁:是指假设最好的情况,去访问数据时,并不会真正的加锁,而是直接访问,在访问的同时识别是否会发生冲突(可能会造成一些资源的浪费,如占用更多的cpu)。

        悲观锁:是指假设最坏的情况,也就是每次访问时,都认为会发生冲突,会真正的加锁。

        synchronized在初期采用乐观锁,当锁竞争激烈时,会自动切换为悲观锁。

        轻量级锁和重量级锁

        轻量级锁和重量级锁是synchronized在进行加锁时的两个状态:

        轻量级锁加锁较快,开销小。

        重量级锁加锁较慢,开销大。

        synchronized在进入轻量级锁状态后,如果锁竞争进一步增加,就会进入重量级锁状态。

        自旋锁和挂起等待锁

        自旋锁是指,当一个线程获取锁失败后,会不断的循环尝试获取锁。一旦锁被其他线程释放,那么这个线程就能立刻获取到锁。自旋锁是一种典型的轻量级锁的实现方法。

        挂起等待锁是指,当一个线程获取锁失败后,会放弃再获取锁,而是等待内核“通知”,收到通知后,再去尝试获取锁。

        自旋锁的优缺点:

        优点:没有放弃cpu,不涉及线程的阻塞和调度,一旦锁被释放,就可以直接获取到锁。

        缺点:一直在占用cpu,如果持有锁的线程工作时间较长,那么自旋锁就会占用很久的cpu但是没有做实质性的工作。

        synchronized的轻量级锁策略就是通过自旋锁实现的。

        公平锁和非公平锁

        公平锁是指,锁会按照尝试获取这个锁的线程的先后顺序来分配,如果A线程持有这个锁,B、C线程尝试锁,但是B线程尝试获取锁的时间早于C,那么这个锁在被A释放后,一定被B获取。

        非公平锁是指,锁之间会进行竞争,还是上面的例子,此时B、C谁能获取到这个锁,就是一个未知的随机状态。

        synchronized是非公平锁。

        可重入锁和不可重入锁

        可重入锁指,当在这个锁的代码块内,再次对这个锁对象上锁,不会出现死锁,能够成功的上锁。允许一个线程多次获取这个锁。

        不可重入锁指,在这种情况下会出现死锁。

        synchronized是可重入锁。

        读写锁

        在多线程中,多个线程都执行读操作,不会出现问题,但是一旦涉及到写操作,那么就很容易出现问题。但是如果在多读少写的环境下,使用普通的加锁方案会导致进行读操作所消耗的资源变多。

        在这种情况下,使用读写锁,就可以缓解资源问题。

        读写锁分为俩个:读锁和写锁,在对不同的操作加锁后,读锁和读锁之间不会冲突,而写锁和读锁、写锁会冲突。这样就把锁之间区分对待,就能让读操作之间不冲突,大大的增加了读操作的吞吐量。

        synchronized不是读写锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值