常用的加锁方式
1、Synchronized
2、ReentrantLock
try {
lock.lock();
} finaly {
lock.unlock();
}
下面看下源码,构造函数中默认是非公平锁,也可传入true变成公平锁,下面对比下非公平锁与公平锁过程

2、调用lock方法



可以看出非公平锁第一步是尝试更改state状态,如果更改成功则直接把当前线程赋值给独占线程,再看acquire

线程以独占模式生成节点,addWaiter会 将新生成的节点prev执行tail,并通过CAS将tail.next 指向新生成的节点,如果CAS失败,则一直循环下去

子类必须重写该方法,否则就会抛出异常

如果state = 0说明线程已经释放锁直接尝试能否CAS操作,如果与当前线程相同(可重入锁)再加1,所以lock与unlock必须同时出现



当前线程阻塞
当unlock时

3、AtomicInteger
https://baijiahao.baidu.com/s?id=1647621616629561468&wfr=spider&for=pc
4、读写锁
本文深入探讨了常用的加锁方式,包括Synchronized、ReentrantLock及其实现原理,原子变量AtomicInteger的应用,以及读写锁的特性。通过源码分析,揭示了非公平锁与公平锁的工作流程,强调了lock与unlock的配对使用对于实现线程安全的重要性。
1269

被折叠的 条评论
为什么被折叠?



