转载

1.2.3 线程安全之java锁相关

  • 自旋锁:为了不放弃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++;
     }
    复制代码
  • 独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)

    • 相当于互斥锁
  • 共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)

原文  https://juejin.im/post/5d838468518825636c0d2692
正文到此结束
Loading...