zoukankan      html  css  js  c++  java
  • synchronized的简记

    synchronized: 在jvm中是使用监视器来实现不同线程的异步执行,在语法的表现就是synchronized。

    1、synchronized的用法:

      1)修饰方法:在方法的前面直接加就行:public synchronized void method()。
    synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。
      2)修饰代码块:一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。但是另外的线程依然可以访问该对象的非synchronized(this)同步代码块。
      3)指定给某个对象加锁:synchronized (account),一样是得当一个线程访问完,解锁后,才能被其他的线程访问。
      4)修饰一个静态方法:静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象。该类中的对象生成的线程并发执行时可以保持线程同步。
      5)修饰一个类:给类加锁和上例的给静态方法加锁是一样的,所有对象公用一把锁。

    2、synchronized关键字不能继承:虽可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。

    如:在子类方法中加上synchronized关键字
    class Parent {
      public synchronized void method() { }
    }
    class Child extends Parent {
      public synchronized void method() { }  #在子类中的这个方法默认情况下并不是同步的,必须显式添加关键字
    }
    在子类方法中调用父类的同步方法:
    class Parent {
      public synchronized void method() { }
    }
    class Child extends Parent {
      public void method() { super.method(); }
    }

    3、在定义接口方法时不能使用synchronized关键字。
    4、构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
    5、无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。(所以,synchronized作用非静态成员方法和静态成员方法上同步的目标是不同的)
    6、实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

  • 相关阅读:
    Flink基于EventTime和WaterMark处理乱序事件和晚到的数据
    flink 有什么优点
    Flink-Kafka 连接器及exactly-once 语义保证
    腾讯大学
    Qt 获取文件路径、文件名、后缀
    Qt QDir::currentPath()和QAppllication::appllicationDirPath()用法区别
    Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法
    Qt comboBox设置下拉菜单()
    Qt 快速读写Excel指南
    可见光的波长与频率对照表
  • 原文地址:https://www.cnblogs.com/yangrongkuan/p/12021482.html
Copyright © 2011-2022 走看看