javaEE学习总结(三)多线程--锁策略

一、乐观锁与悲观锁

悲观锁:在每次拿数据的时候都会上锁。
乐观锁:在数据提交更新的时候,才会正式对数据是否冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。

synchronized初始使用乐观锁策略。当发现锁竞争比较频繁的时候,就会自动切换成悲观锁策略。

二、读写锁

读写锁就是把读操作和写操作区分对待。
读读不互斥;
读写/写写互斥;

Synchronized不是读写锁

三、重量级锁和轻量级锁

重量级锁:加锁机制重度依赖OS提供的mutex互斥锁。
轻量级锁:加锁机制尽可能不适用mutex,而是尽量在用户态代码完成。

四、自旋锁

如果获取锁失败,立即再次尝试获取锁,无线循环,直到获取到锁为止。第一次取锁失败,第二次的尝试会在极短的时间内到来。
优点:没有放弃CPU,不涉及线程阻塞和调度,一旦锁被释放,就能第一时间获取到锁。
缺点:如果锁被其他线程持有的时间比较久,那么就会持续消耗CPU的资源。

五、公平锁和非公平锁

公平锁: 遵守 “先来后到”. B 比 C 先来的. 当 A 释放锁的之后, B 就能先于 C 获取到锁.

你可能感兴趣的:(java-ee,学习,java)