美文网首页
java并发 Synchronized

java并发 Synchronized

作者: 咚咚_Coding | 来源:发表于2022-01-08 17:21 被阅读0次

    class SynchronizedUtils {

    //obj

        private StringmResult;

        /**

        * 类锁

        * a方法,它考察面试者对static关键字的理解

        *

        * static方法一般称为静态方法,又叫类方法。从名字就可以知道,它是隶属于一个类的。因此调用static方法的时候直接使用类名就可以。

        * static方法不依附于任何对象而存在,因此是不可以使用this来调用的。也正是由于这个特性,

        * 我们在static方法中不能访问类的非静态变量和非静态方法,因为类的非静态变量和非静态方法是依附于对象而存在的。

        */

        public synchronized static void a() {

    }

    /**

        * 对象锁

        * 用synchronized关键字修饰的方法叫同步方法,它是用来做同步操作的。很多面试者认为synchronized锁定的是代码块,其实不然。它锁定的是调用当前方法的对象。

        * 实际上,t1和t2两个线程需要去竞争SynchronizedUtils对象的锁,谁竞争到锁,谁就先执行,而另一个则后执行。

        * 在Java中,Jvm会为每个对象内置一个监视器(monitor),监视器中有一个地方叫监视区域,任何线程要想执行这个对象的synchronized方法,都必须先进入到该对象的监视区域。

        * 监视器负责保证同一时刻只有一个线程在监视区域执行。

        */

        public synchronized void b() {

    }

    /**

        * 类锁

        * 在Java中,任何一个对象都能找到其所属的类。Jvm会为每个类都维护唯一的一个Class类对象,用于记录这个类的原始信息,这也是Java中反射机制能够存在的底层基础。

        * 如果你了解这个机制,你就可以理解c方法中的synchronized代码块的作用。它是给Demo类对应的Class对象加锁的,即多个线程会竞争以进入Demo.class这个对象的监视器区域。

        * 那就是用static synchronized 修饰的a方法也是锁定的Demo.class对象,所以,c方法和a方法是等价的。

        */

        public static void c() {

    synchronized (SynchronizedUtils.class) {

    }

    }

    /**

        * 对象锁

        * this指的是调用当前方法的对象。

        * 第一次调用时,synchronized(this)中的this指定的SynchronizedUtils对象,因此锁定的是SynchronizedUtils对象。第二次调用时,synchronized(this)中的this指定的demo2对象,因此锁定的是demo2对象。

        *

    */

        public void d() {

    synchronized (this) {

    }

    }

    }

    相关文章

      网友评论

          本文标题:java并发 Synchronized

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