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行操作码。

  • 相关阅读:
    宏 定 义 编 译 出 错
    SSWR 跟 进一法除法
    显示文件后缀扩展名
    基于MPLAB X IDE配置位设置讲解
    mplab xIde 编译成功,但不能生成Hex文件
    InputStream 、 InputStreamReader 、 BufferedReader
    MPLAB® XC C编译器的Workstation License的获取及安装方法
    MPLAB设置路径
    js中的cookie及封装
    nodejs中使用node-sass
  • 原文地址:https://www.cnblogs.com/nafio/p/9137729.html
Copyright © 2011-2022 走看看