zoukankan      html  css  js  c++  java
  • java synchronized

    同步类型

    1 同步代码块

    synchronized(obj)
    
    {
    
    }
    
    

    obj是一个对象的实例

    一个线程A执行这个代码块时,其他线程(B,C,D)遇到被obj同步的代码块就阻塞,等待A解除占用后再执行,A可以在同步代码块中调用被obj同步的其他代码块内容。

    2 同步函数

    public synchronized void action()
    
    {
    
    }
    
    

    方法同步时,同步锁对象是调用这个方法的对象

    3 同步静态函数

    4 同步类

    Class Foo 
    {
     public synchronized static void methodA()
     {
     }
     public void methodBBB()
     {
        synchronized(Foo.class)   //  class literal(类名称字面常量)
     }
    }
    
    

    代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

    特殊注意

    1 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象

    2 每个对象只有一个锁与之相关联。

    3 实现同步要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

    4 但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

    class Foo implements Runnable

    {
       private byte[] lock = new byte[0];  // 特殊的instance变量
       Public void methodA()
       {
         synchronized(lock) {
         }
       }
    }

    注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

  • 相关阅读:
    Kaka's Matrix Travels
    Cable TV Network
    LightOJ 1137
    SPOJ AMR11E Distinct Primes 基础数论
    HDU 5533Dancing Stars on Me 基础几何
    POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解
    vijos 1180 选课 树形DP
    vijos 1313 金明的预算方案 树形DP
    LightOJ 1062
    vijos 1464 积木游戏 DP
  • 原文地址:https://www.cnblogs.com/nafio/p/9137729.html
Copyright © 2011-2022 走看看