9、8锁现象彻底的理解锁(锁的只有两个东西,一个是对象,一个是Class模板(static修饰))

8锁现象彻底的理解锁(锁的只有两个东西,一个是对象,一个是Class模板(static修饰))

第一个问题:(资源类的两个方法都是加syn的,只有一个对象时)(先发短信再打电话)

其中打印的肯定是先有发短信,然后是打电话。

这里聊下逻辑:这里是因为锁,首先我们要知道我们这锁的是什么,锁的是我们的调用对象,也就是我们在main中的new的对象。只有一个对象所以其中是谁先拿到这个锁谁就先执行,所以就是先发短信再打电话

问题二:(我们还是只有一个对象,然后让第一个线程的调用的方法先等待4秒再输出)-(先发短信再打电话)

逻辑:输出现象是先等4秒还是先输出发短信,然后才是打电话(其中我们要知道,这里还是锁的问题,我们锁的这里只有一个对象,那么就是谁先拿到锁谁就先执行了)

问题三:(我们在资源类中在给他一个没有锁的方法。我们让线程一个去调用加syn的方法(这个方法有一个先休眠4秒),一个去调用没有锁的方法(hello方法))(这里就会先输出hello,然后再输出发短信了)

逻辑:这里的现象是,先打印出hello再等4秒打印出发短信,我们这里hello方法没有这个syn这个锁的,所以不受这个锁的影响。(而我们这里的锁的方法是先睡眠4秒才执行的)

问题4:(我们准备两个对象,一个线程让对象1去调用发短信(还是睡眠4s的),一个线程让对象2去调用打电话)(这里是先打电话再等4s输出发短信了)

逻辑:这里的现象是打电话再等4s输出发短信了,原因是这两个对象就是两把锁,所以就是按时间来执行了,我们对象1的方法先睡眠了4s嘛。

问题5:(两个静态的syn同步方法了(static),只有一个对象去调用方法)(先等4s发短信,再打电话)

.

逻辑:这里的现象是先等4s输出发短信(方法先睡眠4s嘛),然后是打电话。这里我们的锁的方法是被static修饰的,这个是static修饰的东西是跟着类加载的时候就加载出来了(类一加载就有Class模板了),然后这个syn锁的就是对象的Class模板

问题6:(两个static修饰syn锁方法,两个对象分别去调用一个方法)(还是先等4s发短信,再打电话)

逻辑:现象是先等4s发短信,然后输出打电话,他们这里虽然是两个对象但是资源类的锁被static修饰,锁的就是类刚被加载出来的额Class对象(模板)。一个类是只有一个模板的(new的对象不同,但是对象的模板是同一个)。所以我们锁的东西就是Class模板就这一个。那么也是谁先拿到这个锁,谁就先执行

问题7:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后只有一个对象,两个线程使用)(先打电话,再等4s输出发短信)

逻辑:这里的现象是先打电话再等4s输出发短信,这里的逻辑是,上面的static修饰syn其锁的是Class模板还要休眠4s再输出,而我们下面syn修饰的普通同步方法锁的是我们new出来的对象(实例对象)。两个锁的不是同一个东西。而前面的static syn还要先休眠4s那么肯定就是下面的syn普通方法先执行咯(按照时间)

问题8:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后两个实例对象)(还是先打电话,再等4s才是发短信)

逻辑:现象还是先打电话,再等4发短信,与问题7是一样的,前面static syn锁的是Class模板(还要先休眠4s),只是syn普通同步方法锁的是对象2了。所以两个锁的不是同一个东西,值看执行时间,而static syn方法要先休眠4s在输出

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127859602
今日推荐