zoukankan      html  css  js  c++  java
  • Java 中的各种锁(参考:https://mp.weixin.qq.com/s/G4zfnAQH-PJz8jUREX41OA)

    锁的类型 锁的实现
    乐观锁 在数据库中可以使用version版本号去实现;在Java中是使用CAS(Compare And Swap)算法(CAS算法:是一种无锁算法,是Java提供的非阻塞原子性操作,CAS通过硬件保证了比较更新的原子性,在JDK中Unsafe提供了一系列的compareAndSwap*方法;CAS有ABA问题,解决办法:在JDK1.5后加入了AtomicStampedReference方法给每个变量加入了一个时间戳来避免ABA问题。)来实现,在并发包(java.util.concurrent)中原子类都是使用CAS来实现乐观锁的。
    悲观锁 synchronized关键字、Lock的实现类
    公平锁 多个线程同时申请锁的话,线程会放入一个队列中,在队列中第一个进入队列的线程才能获取锁资源,讲究的是先到先得。new ReentrantLock(true) 提供了公平锁的实现。
    非公平锁 new ReentrantLock(false) 提供了非公平锁的实现。
    独占锁(排他锁) 独占锁就是每次只有一个线程能霸占这个锁资源,而其他线程就只能等待当前获取锁资源的线程释放锁才能再次获取锁;ReentrantLock 就是独占锁,其实准确的说独占锁也是悲观锁。
    共享锁 共享锁其实也是乐观锁,它放宽了锁的策略允许多个线程同时获取锁。在并发包中 ReadWriteLock 就是一个典型的共享锁,它允许一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。
    自旋锁 自旋锁其实就是当一个线程获取锁的时候,这个锁已经被其他人获取到了,那么这个线程不会立马挂起,反而在不放弃CPU使用权的情况下会尝试再次获取锁资源,默认次数是10次,可以在JVM中使用-XX:PreBlockSpin官方说明)来设置次数。如果自旋锁获取锁的时间太长,会造成后面的线程CPU资源耗尽释放。并且自旋锁是不公平的。

    出处:https://mp.weixin.qq.com/s/G4zfnAQH-PJz8jUREX41OA

  • 相关阅读:
    不定长内存池之apr_pool
    FFmpeg介绍及参数详细说明
    Linux下ffmpeg安装与开发配置
    基于Live555,ffmpeg的RTSP播放器直播与点播
    ffmpeg开发指南
    boost::bind的使用方法
    开启Linux VNC远程桌面
    Fedora 启动 SSH服务
    Linux中查看进程及杀死进程命令
    __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
  • 原文地址:https://www.cnblogs.com/cag2050/p/11777341.html
Copyright © 2011-2022 走看看