synchronized(锁)与 ReentrantLock(可重入锁) 对比
1. Synchronized :编译器去保证锁的加锁和释放。ReentrantLock:程序员手动进行加锁和释放。
2.便灵性:synchronized 使用更便利。
3.性能:reentrantlocak 更好,尝试在用户态解决加锁问题,避免进入内核的线程阻塞。
相同:都是同步锁,但是,Synchronized线程阻塞和唤醒的代价高。
reentrantLocak实现原理
CAS
https://www.cnblogs.com/zhangfengshi/p/9203191.html
公平锁和非公平锁对比
公平锁:线程请求锁时,如果另一个线程占用锁或者队列不为空,将该线程加入队列。
非公平锁:线程请求锁时,锁没有被占用,就尝试获取锁;锁被占用,才会放入队列。
优缺点分析:
非公平锁性能高于公平锁性能。恢复一个被挂起的线程比较耗时,且非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。
但非公平锁存在抢占,可能会造成线程饿死。
乐观锁和悲观锁:
https://blog.csdn.net/qq_34337272/article/details/81072874
悲观锁:
每次拿数据的时候都担心别的线程会修改,因此每次拿数据都会加上锁。
乐观锁:
假设拿数据的时候不会被别的线程修改,因此拿数据不会加锁,但是修改数据的时候需要进行比较,看该数据是否被别的线程修改(可版本号机制,CAS实现)。
版本号:
拿数据的时候取一个version,修改数据时,会查看当前版本号与数据库版本号是否一致,一致就可以更改,否则重试。
CAS:
(非阻塞同步)存该数据原来的值A,修改数据时,看该数据是否仍然为A,如果为A,则更新。
非阻塞同步:在并发环境下,某个线程对共享变量先进行操作,如果没有其他线程争用共享数据那操作就成功;如果存在数据的争用冲突,那就才去补偿措施,比如不断的重试机制,直到成功为止,因为这种乐观的并发策略不需要把线程挂起,也就把这种同步操作称为非阻塞同步(操作和冲突检测具备原子性)。
在硬件指令集的发展驱动下,使得 "操作和冲突检测" 这种看起来需要多次操作的行为只需要一条处理器指令便可以完成,这些指令中就包括非常著名的CAS指令(Compare-And-Swap比较并交换)。