常用的加锁方式
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、读写锁