【多线程学习】锁的几种现象

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

学习了锁的使用,却还没有探究过锁。这次通过对锁的几种现象学习又加深了对锁的了解

现象1

标准情况下:两个线程,A线程打印发短信,B线程打印打电话,代码中A线程在B线程的前面,运行结果会是先打印 打电话 还是 发短信

image.png 运行程序查看结果,无论运行多少次都是打印发短信在前面

image.png

这种现象是因为synchronized 锁的对象是方法的调用者,这里使用的对象都是同一个,所以两个方法是同一个锁,谁拿到锁就谁先执行

现象2

如果在Phne里面在增加一个普通方法,打印Hello,调用改为A线程执行打印发短信,B线程执行打印Hello,运行结果会是打印什么

image.png

运行结果是先打印的Hello,和上面现象1的执行顺序又不一样了,是因为hello()是普通方法不受锁的影响

现象3

新建两个对象,两个调用者去分别执行现象一中的,执行结果是先打印 打电话还是发短信

image.png

运行结果:

image.png 执行结果:是先打印的打电话,因为现在是两把锁,然后发短信是有延迟的所以这次会先打印 打电话而不是发短信

现象4

将打印发短信和打电话的方法都改成静态方法,在按照现象1的实现步骤,运行结果会是先打印打电话还是发短信?

image.png

image.png

运行结果:发短信在前面,但是这里的真正原因和现象1中的是不同的,这是因为 static 静态方法,类一加载的时候就有了,锁的就是Class

可以创建两个对象,在来测试一下这个效果会更加直观,锁的直接就是Class对象,这两个对象的类模板始终只有一个

小结

new 出来的 this 具体的一个手机 static Class 唯一的一个模板

关键就是看锁的对象是什么

猜你喜欢

转载自juejin.im/post/7031545841005363231
今日推荐