深入理解synchronized关键字

2020-02-26  本文已影响0人  FlyerGo

synchronized是如何实现同步的

synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。

而锁的机制是如何实现同步的呢?这主要是因为锁的以下两种特性:

synchronized修饰不同对象的区别

我们来看一个例子回答以下几个问题:


public class A {


    public synchronized void a() {


    }


    public static synchronized void staticA() {


    }


    public void aa(){
        synchronized (A.class){


        }
    }


    public void aaa(){
        synchronized (this){


        }
    }


    public void b(){

    }


}

两个不同的对象,两个线程分别调用两个对象的a方法,请问是否构成了线程同步?
没有构成线程同步,因为每个对象都有自己的锁。

一个对象,两个并发线程同时调用这个对象的a方法呢?
构成线程同步,因为a方法被synchronized修饰,每次只能被一条线程调用,其他想要调用的线程会进入阻塞。

同一个对象的a方法和aaa方法是否构成互斥?
是的因为方法a被synchronized修饰,使用的当前对象锁。

当一条线程调用方法aaa还未执行完毕,另外一个线程能调用b方法吗?
能,因为b方法没有被synchronized修饰

方法staticA和方法aa是否构成互斥关系
是,因为方法staticA是静态方法,且使用了synchronized修饰,相当于类锁,
而方法aa也是类锁

总结

volatile和synchronized的区别

对于volatile关键字,当且仅当满足以下所有条件时可使用:

  1. 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
  2. 该变量没有包含在具有其他变量的不变式中。
    jvm对synchronized做了什么优化
上一篇 下一篇

猜你喜欢

热点阅读