美文网首页
Java 中的 synchronized 关键字

Java 中的 synchronized 关键字

作者: wuchao226 | 来源:发表于2018-10-15 22:20 被阅读8次

    Java 多线程中的同步机制会对资源进行加锁,保证同一时间只有一个线程可以操作对应资源,避免多线程同时访问相同资源发生冲突。Synchronized 是 Java 中的关键字,是一种同步锁,可以实现同步机制。

    Synchronized 修饰的对象有一下几种:

    1. 修饰一个类。作用范围是 Synchronized 后面括号括起来的部分,作用的对象是这个类的所有对象。
    2. 修饰普通方法方法。被修饰的方法称为同步方法,作用范围是整个方法。一个对象中的加锁方法只允许一个线程访问,但这种情况下锁的是访问该方法的实例对象,如果多个线程不同对象访问该方法,则无法保证同步。
    3. 修饰静态方法。由于静态方法是类方法,所以锁的是包含该方法的类,也就是类对象;如果多个线程不同对象访问该静态方法,可以保证同步。
    4. 修饰代码块。普通代码块如 Synchronized(obj),obj 可以为类中的一个属性,也可以是当前的对象,同步效果和修饰普通方法一样; Synchronized(obj.class) 静态代码块的同步效果和修饰静态方法类似。
    • Synchronized 方法控制的范围较大,它会同步对象中的所有 Synchronized 方法的代码
    • Synchronized 代码块控制范围较小,只会同步代码块中的代码,而位于代码块之外的代码可以被多个线程访问,Synchronized代码块更加灵活精确。

    修饰类

    其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象,如下代码:

    class ClassName {
          public void method() {
             synchronized (ClassName.class) {
                 //todo
             }
         }
     }
    

    修饰普通方法

    Synchronized 修饰一个方法就是在方法签名加 Synchronized,如下代码:

    public synchronized void method() {
    }
    

    在定义接口方法时不能使用 Synchronized 关键字
    构造方法不能使用 Synchronized 关键字,但可以使用 Synchronized 代码块来进行同步
    Synchronized 不能被继承。如果子类覆盖了父类的被 Synchronized 关键字修饰的方法,那么子类的该方法只要没有 synchronized 关键字,那么就默认没有同步,也就是说,不能继承父类的 synchronized。

    修饰静态方法

    静态方法属于类而不属于对象,所以 Synchronized 修饰的静态方法锁定的是这个类的所有对象。

     public synchronized static void method() {
     }
    

    相关文章

      网友评论

          本文标题:Java 中的 synchronized 关键字

          本文链接:https://www.haomeiwen.com/subject/ubpfzftx.html