自旋锁:为了不放弃CPU执行事件,循环的使用CAS技术对数据尝试进行更新,直至成功。
int current; do { // 操作耗时的话, 那么 线程就会占用大量的CPU执行时间 current = unsafe.getIntVolatile(this, valueOffset); } while (!unsafe.compareAndSwapInt(this, valueOffset, current, current + 1)); // (可能会失败)CAS命令,如果current值发生变化,则操作失败 复制代码
悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。
synchronized (this) { i++; } 复制代码
独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)
共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)