zoukankan      html  css  js  c++  java
  • JUC中的锁

    内部锁:
    
         内部锁就是synchronised,由jvm内部实现管理
    重入锁:
         它可以中断、可定时
         重入锁(ReentrantLock),提供公平和非公平两种锁,公平锁保证先进先出,但是有一定的性能省耗
         它是一种互斥的实现,一次只能一个线程拿到锁;
         如果一个线程试图获取一个已经由它自己持有的锁,那么这个请求会成功,“重入”意味着获取锁的粒度是线程,而不是调用者。
    
    读写锁:
         读写锁(ReadWriteLock)是读写分离的锁,适用场景是读多写少,读锁可以同时有多个线程获得,获得读锁的所有线程的读操作是并行的。
         但读和写的线程是串行的,也就是说写的时候,获得读锁的线程都需要等待。
    信号量:
         信号量(Semaphore)是对锁的扩展,它可以限定对某一具体资源的最大可访问线程数。
         如Pool的实现,可以最大连接数,每个连接相当于一个许可,如果超过最大连接数,请让申请连接的线程等待。
    
    锁条件对象:
         锁条件对象(Condition)是通过锁实例的newCondition()方法创建的,用于实现业务层的一些复杂逻辑
         如在Queue的实现中,就是创建了一个非空(notEmpty)和一非满(notFull)的条件对象来实现,当队列满时让生产者线程等待,在队列空时
         让消费者线程等待。
    
    自旋锁:
         自旋锁(SpinningLock)是JVM对锁优化的手段,线程被挂取和切换的资源消耗是很高的,所以JVM可以在没有取得锁时,不被挂起,而去执行
    一个空循环(即所谓的自旋),在若干个自旋如果获得了锁,就继续执行,如果还未能获得锁才会被挂起。
         可以通过-XX:+UseSpinning参数来开启自旋锁,通过-XX:PreBlockSping参数来设置自旋锁的等待次数。
    
    锁消除:
         锁消除是JVM在即时编译时,通过到上下文的扫描,去除不可能存在共享资源竞争的锁,从而节省无竟义的请求锁时间。
         如:在开发中开发人员必须会用到大量的StringBuffer和Vector等。他们很有可能是方法内部的,不存在资源竞争的问题。
         可以常过设置JVM参数逃逸分析(-XX:+DoEscapeAnalysis)和锁清除(-XX:+EliminateLocks)开启,但必须工作在-server模式下。
    
    同步倒数计数器:
         同步倒数计数器(CountDownLatch)是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
    
    
    栅栏:
         栅栏(CyclicBarrier),一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
    
  • 相关阅读:
    JDK、JRE、JVM的区别联系
    1.1 计算机基础知识 —— 二进制
    java--面试中遇到的各种比较区别
    springMVC 运行流程
    算法--常用排序和查找
    Java面试问题总结
    dpkg:error错误求解:——重复文件触发关注
    memcpy实现
    Palindrome Number
    no matching function for call to 'sort(...),
  • 原文地址:https://www.cnblogs.com/zengxianxi/p/3607908.html
Copyright © 2011-2022 走看看