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