最近发现synchronized锁的是什么?甚至有人认为synchronized锁的是代码??!这个我觉得还是很有必要通过实际的示例来说明synchronized锁的到底是什么。
根据获取的锁的分类:获取对象锁和获取类锁!
获取对象锁的两种用法
1、同步代码块(synchronized(this), synchronized(类实例对象)),锁是小括号()中的实例对象。
2、同步非静态方法(synchronized method),锁是当前对象的实例对象。
获取类锁的两种用法
1、同步代码块(synchronized(类.class)),锁是小括号()中的类对象,即Class对象。
2、同步静态方法(synchronized static method),锁是当前对象的类对象(Class对象)。
对象锁示例
看看这样一段代码:
SynchronizedDemo.java
1 | package thread_study.synchronize; |
SynchronizedMain.java
1 | package thread_study.synchronize; |
但是如果我们传入不同的对象呢?
1 | package thread_study.synchronize; |
从上面的代码和结果中我们可以得出一个结论,那就是
获取对象锁的两种用法:
1、同步代码块(synchronized(this), synchronized(类实例对象)),锁是小括号()中的实例对象。
2、同步非静态方法(synchronized method),锁是当前对象的实例对象。
同步非静态方法锁住整个方法,而同步代码块只是锁住的只是方法中的一部分代码
获取类锁的两种用法
1、同步代码块(synchronized(类.class)),锁是小括号()中的类对象,即Class对象。
2、同步静态方法(synchronized static method),锁是当前对象的类对象(Class对象)。
同步静态方法锁住整个方法,而同步代码块只是锁住的只是方法中的一部分代码,与上面一样的
类锁示例
下面来看看同步静态方法和同步代码块(synchronized(类.class))的效果吧:
1 | package thread_study.synchronize; |
SynchronizedMain.java
1 | package thread_study.synchronize; |
对象锁和类锁不会干扰
最后看看类锁和对象锁是否会相互影响呢?
修改一下代码:
1 | package thread_study.synchronize; |
可以看出来,类锁和对象锁是不会相互干扰的!
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/3254260081.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!