zoukankan      html  css  js  c++  java
  • java锁

    ---恢复内容开始---

    synchronized 互斥锁

    synchronized(this) 当前类的所有synchronized(this) 都被锁了,还有synchronized static也一样

    synchronized代码块实际上多了monitorenter和monitorexit两条指令。monitorenter指令执行时会让对象的锁计数加1,而monitorexit指令执行时会让对象的锁计数减1

    对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象;
    synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

    锁从宏观上分为乐观锁和悲观锁

    synchronized是悲观锁,认为写多,对读也加锁,retreentlock通过cas获取锁,获取不到才转为悲观锁。

    CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

    synchronized是重量级锁,争用不到锁的线程会进入阻塞状态。重量级锁是悲观锁的一种。

    java1.5引用偏向锁和轻量锁,默认启动了自旋锁,这些都属于乐观锁。

    自旋锁:如果持有锁的线程能在段时间内释放,那么等待竞争锁的线程就不做用户态与内核态的切换。避免了切换的消耗。他会做自选,这样也是会消耗cpu的,所以,应该设置一个自旋等待时间,如果过了时间还没得到锁就进入线程阻塞状态。

    适用于,锁竞争不激烈,且用所时间非常短的代码块。

    jdk1.7以后,是否开启自旋锁,由JVM控制,时间阈值也是自适应的,一般和线程上下文切换的时间差不多。

    偏向锁是在无锁争用的情况下使用的,也就是同步开在当前线程没有执行完之前,没有其它线程会执行该同步块,一旦有了第二个线程的争用,偏向锁就会升级为轻量级锁,如果轻量级锁自旋到达阈值后,没有获取到锁,就会升级为重量级锁

  • 相关阅读:
    Autofac ASP.NET Web API (Beta) Integration
    An Autofac Lifetime Primer
    Web api help page error CS0012: Type "System.Collections.Generic.Dictionary'2错误
    c++ 全局变量初始化的一点总结
    C++中extern关键字用法小结
    为什么多线程读写 shared_ptr 要加锁?
    CentOS7 安装Chrome
    在CentOS 7中使用VS Code编译调试C++项目
    am335x hid-multitouch.c
    implicit declaration of function 'copy_from_user'
  • 原文地址:https://www.cnblogs.com/jyzyz/p/10695293.html
Copyright © 2011-2022 走看看