zoukankan      html  css  js  c++  java
  • Java中锁的分类

    1.内部锁

    就是对象本身,每个Java对象都可以隐式地扮演一个用于同步的锁的角色;这些内置的锁被称

    为内部锁(intrinsic locks)或监视器锁(monitorlocks)。执行线程进入synchronized块之前会

    自动获得锁;而无论通过正常控制路径退出,还是从块中抛出异常,线程都在放弃对

    synchronized块的控制时自动释放锁。获得内部锁的唯一途径是:进入这个内部锁保护的同步

    块或方法。内部锁在Java中扮演了互斥锁(mutual exclusion lock,也称mutex)的角色,意味着

    至多只有一个线程可以拥有锁,当线程A尝试请求一个被线程B占有的锁时,线程A必须等待或者

    阻塞,直到B释放它。如果B永远不释放锁,A将永远等下去。同一时间,只能有一个线程可以运

    行特定保护的代码块,因此,由同一个锁保护的synchronized块会各自原子地执行,不会相互

    干扰。在并发的上下文中,原子性的含义不慌不忙 它在事务应用中相同---一组语句

    (statements)作为单独的,不可分隔的单元运行。执行synchronized块的线程,不可能看到会

    有其他线程能同时执行同一个锁保护的synchronized块。

    2.Java中的私有锁对象

    private Object lock = new Object();
    public void foo(){
        synchronized(lock){
          ......
     }
    }
    使用私有锁对象,而不是对象的内部锁(或任何其它可公共访问的锁),有很多好处,私有的锁

    对象可以封装锁,这样客户端代码无法得到它。然而可公共访问的锁允许客户端涉足它的同步

    策略----正确或不正确地。客户端不正确地得到另一个对象的锁,会引起活跃度方面的问

    题。

    3.其它锁

    我们还可针对代表某种共享资源的对象加锁。比如一些集合类等待。

  • 相关阅读:
    AtCoder,Codeforces做题记录
    最小割分治(最小割树):BZOJ2229 && BZOJ4519
    [BZOJ2209][JSOI2011]括号序列(splay)
    [BZOJ5461][LOJ#2537[PKUWC2018]Minimax(概率DP+线段树合并)
    [LOJ#2540][PKUWC2018]随机算法(概率DP)
    [CC-SEABUB]Sereja and Bubble Sort
    [CC-ANUGCD]Maximum number, GCD condition
    [HDU5965]扫雷
    [ZJOI2007]最大半连通子图
    [BZOJ2152]聪聪可可
  • 原文地址:https://www.cnblogs.com/zhizhuwang/p/3474729.html
Copyright © 2011-2022 走看看